Merhaba Paint deki renkle doldur özelliğini Delphi tarafında nasıl yapabilirim.
Çizilmiş resimdeki tıklanan yer içindeki alanı renklendirmek istiyorum.
Tabi resimler önceden çizildiği için rectangle draw gibi özellikler pek işe yaramadı.
teşekkürler
Delphi mevcut resimde renkle doldurma
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
Re: Delphi mevcut resimde renkle doldurma
Merhaba,
Fare ile tıklanan noktanın rengini hafızaya alın.
Yukarı, aşağı, sağa sola aynı renk olan pixel rengini kullanıcının seçtiği renk olarak değiştirin. Renk değişim noktasına geldiğinde o yöne işlem tamamlanmıştır. Diğer kalan yönlere devam edin. Örn; beyaz renk sarı yapılacak. Beyaz noktaya tıklandı. Siz beyaz dışında renk bulana kadar her yöndeki pixel renklerini sarı yapacaksınız.
Bitmap işlemi olacağını tahmin ediyorum. ScanLines gibi bir özelliği var diye hatırlıyorum. Onu kullanın. Yoksa işlem büyük resimler için çok yavaş tamamlanacaktır.
Fare ile tıklanan noktanın rengini hafızaya alın.
Yukarı, aşağı, sağa sola aynı renk olan pixel rengini kullanıcının seçtiği renk olarak değiştirin. Renk değişim noktasına geldiğinde o yöne işlem tamamlanmıştır. Diğer kalan yönlere devam edin. Örn; beyaz renk sarı yapılacak. Beyaz noktaya tıklandı. Siz beyaz dışında renk bulana kadar her yöndeki pixel renklerini sarı yapacaksınız.
Bitmap işlemi olacağını tahmin ediyorum. ScanLines gibi bir özelliği var diye hatırlıyorum. Onu kullanın. Yoksa işlem büyük resimler için çok yavaş tamamlanacaktır.
Re: Delphi mevcut resimde renkle doldurma
firemonkey de scanline yok. ve pixcel[x,y] de diyemiyoruz.
bu nedenle tüm işlemler bitmap arrayın içinde dönmek gerekiyor. O da yavaş oluyor. daha hızlı yapacak bir yöntem varmıdır?
bu nedenle tüm işlemler bitmap arrayın içinde dönmek gerekiyor. O da yavaş oluyor. daha hızlı yapacak bir yöntem varmıdır?
Re: Delphi mevcut resimde renkle doldurma
Sorunuzu sorarken platform ve Delphi sürümü belirtmemişsiniz.
FMX.Types.TBitmap.GetScanline() olarak FMX platformunda kullanabilirsiniz.
FMX.Types.TBitmap.GetScanline() olarak FMX platformunda kullanabilirsiniz.
Re: Delphi mevcut resimde renkle doldurma
Merhaba
Bu kod Fmx de çalışıyor
Bu kod Fmx de çalışıyor
Kod: Tümünü seç
procedure Bitmap_FloodFill(fBitmap: TBitmap; StartX,StartY : Integer; FillColor: TAlphaColor);
var
fBitmapData : TBitmapData;
X, Y : Integer;
ReplaceColor : TAlphaColor;
Stack : Array of TPoint;
fHeight : Integer;
fWidth : Integer;
procedure PutInStack(X, Y: Integer);
begin
SetLength(Stack, Length(Stack)+1);
Stack[Length(Stack)-1] := Point(X, Y);
end;
procedure GetFromStack(var X, Y: Integer);
begin
X := Stack[Length(Stack)-1].X;
Y := Stack[Length(Stack)-1].Y;
SetLength(Stack, Length(Stack)-1);
end;
begin
X := StartX;
Y := StartY;
fHeight := fBitmap.Height;
fWidth := fBitmap.Width;
if (X >= fWidth) or (Y >= fHeight) then Exit;
If fBitmap.Map(TMapAccess.ReadWrite,fBitmapData) then
Try
ReplaceColor := fBitmapData.GetPixel(X,Y);
If ReplaceColor <> FillColor then
Begin
PutInStack(X,Y);
While Length(Stack) > 0 do
Begin
GetFromStack(X,Y);
While (X > 0) and (fBitmapData.GetPixel(X-1, Y) = ReplaceColor) do Dec(X);
While (X < fWidth) and (fBitmapData.GetPixel(X , Y) = ReplaceColor) do
Begin
if Y > 0 then If fBitmapData.GetPixel(X, Y-1) = ReplaceColor then PutInStack(X, Y-1);
if Y+1 < fHeight then If fBitmapData.GetPixel(X, Y+1) = ReplaceColor then PutInStack(X, Y+1);
fBitmapData.SetPixel(X,Y,FillColor);
Inc(X);
End;
End;
End;
Finally
fBitmap.Canvas.Bitmap.Unmap(fBitmapData);
End;
end;
Ahmet DENİZ