Delphi mevcut resimde renkle doldurma

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
JavaCiva
Üye
Mesajlar: 54
Kayıt: 27 Tem 2014 05:10

Delphi mevcut resimde renkle doldurma

Mesaj gönderen JavaCiva »

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
ertank
Üye
Mesajlar: 1527
Kayıt: 12 Eyl 2015 12:45

Re: Delphi mevcut resimde renkle doldurma

Mesaj gönderen ertank »

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.
JavaCiva
Üye
Mesajlar: 54
Kayıt: 27 Tem 2014 05:10

Re: Delphi mevcut resimde renkle doldurma

Mesaj gönderen JavaCiva »

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?
ertank
Üye
Mesajlar: 1527
Kayıt: 12 Eyl 2015 12:45

Re: Delphi mevcut resimde renkle doldurma

Mesaj gönderen ertank »

Sorunuzu sorarken platform ve Delphi sürümü belirtmemişsiniz.

FMX.Types.TBitmap.GetScanline() olarak FMX platformunda kullanabilirsiniz.
AhmetNuri
Üye
Mesajlar: 255
Kayıt: 02 Tem 2007 07:55
Konum: ist
İletişim:

Re: Delphi mevcut resimde renkle doldurma

Mesaj gönderen AhmetNuri »

Merhaba

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
Cevapla