image'in rengi nasil degisitiririm

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
_a.jade_
Üye
Mesajlar: 4
Kayıt: 25 Nis 2006 10:10

image'in rengi nasil degisitiririm

Mesaj gönderen _a.jade_ »

iyi gunler bir sorum olacakti.Bir image'in rengini siyah beyaza donusturmek istiyorum. RGB sini siyah-beyaz tonlarinda olmasi gerekiyor.Nasil bir yol izleyecegim konusunda bana yardimci olur musunuz? Tesekkur ederim Simdiden.
mkysoft
Kıdemli Üye
Mesajlar: 3110
Kayıt: 26 Ağu 2003 12:35
Konum: Berlin
İletişim:

Mesaj gönderen mkysoft »

sanırım image nesnesinin paletleriyle oynayarak yapabilirsiniz. ama nasıl yapılabilceği konusunda fikrim yok. Diğer bir yöntemde resim üzerindeki tüm noktaları tek tek işlemeniz olabilir.
Kullanıcı avatarı
hbahadir
Kıdemli Üye
Mesajlar: 544
Kayıt: 06 Ara 2004 05:03
Konum: BURSA idi artık İST.
İletişim:

Mesaj gönderen hbahadir »

TProEffectImage bileşeni (freeware) istediğini ve hatta daha da fazlasını yapıyor. Internette aratırsan bulabilirsin.
Kullanıcı avatarı
bluekid
Kıdemli Üye
Mesajlar: 541
Kayıt: 11 Haz 2004 10:45
İletişim:

Mesaj gönderen bluekid »

yanlış bilmiyorsam
image->Picture->Bitmap->Monochrome = true;
Kullanıcı avatarı
hbahadir
Kıdemli Üye
Mesajlar: 544
Kayıt: 06 Ara 2004 05:03
Konum: BURSA idi artık İST.
İletişim:

Mesaj gönderen hbahadir »

Monochrome resmi sadece siyah ve beyaz renklerine çevirir.
Kullanıcı avatarı
bluekid
Kıdemli Üye
Mesajlar: 541
Kayıt: 11 Haz 2004 10:45
İletişim:

Mesaj gönderen bluekid »

Bir image'in rengini siyah beyaza donusturmek istiyorum.
ulu coder
Üye
Mesajlar: 838
Kayıt: 01 Nis 2006 06:46
Konum: Ankara

Mesaj gönderen ulu coder »

Kodla yapmak istersen;

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
var
  x,y:integer;
  renk:integer;
  kir,yes,mav:byte;
  gri:byte;
begin
  For x:=0 to Image1.Width-1 Do
  begin
    For y:=0 to Image1.Height-1 Do
    begin
      renk:=ColorToRGB(Image1.Canvas.Pixels[x,y]);
      kir:=renk div 65536;
      renk:=renk mod 65536;
      yes:=renk div 256;
      mav:=renk mod 256;
      gri:=(kir+yes+mav)div 3;
      //if gri<128 Then gri:=0 Else gri:=255;// sadece siyah beyaz olması için bunu da kullan
      Image1.Canvas.Pixels[x,y]:=RGB(gri,gri,gri);

    end;
  end;

end;  
Sadece bmp uzantılı dosyaları dönüştürüyor.
Akin_Delphi
Üye
Mesajlar: 163
Kayıt: 06 Nis 2006 12:22

Mesaj gönderen Akin_Delphi »

Bunun için ben şöyle bir strateji izliyorum. Ancak bazen işe yaramayabiliyor. Hatırladığım kadarıyla anlatayım.

önce uses bölümüne jpeg unit'ini ekleyiniz.

Kod: Tümünü seç

var
Ajpeg : TJpegImage;
begin
 Ajpeg : TJpegImage.Create;
 Ajpeg.Grayscale := True;
 AJpeg.DIBNeeded := true;
 AJoeg.CompressionQuality : 1;
 AJpeg.Assign(ABitmap);
 AJpeg.Compress;
 ABitmap.Empty;
 ABitmap.Assign(AJpeg);
end;
gibi bir şeyler olması lazım.

Saygılar ve Başarılar.

Not :
Bu kullanıcıya hocam dediğinizde kendini kötü hissediyor, kızarıp bozarıyor.
Sayın Ulucoder, bir keresinde ben de size hocam diye hitap etmiştim. Kusura bakmayın. Bir daha olmaz. :oops: :oops:
_a.jade_
Üye
Mesajlar: 4
Kayıt: 25 Nis 2006 10:10

Mesaj gönderen _a.jade_ »

Cevap yazan ve yardımları geçen herkese tekrar teşekkür ederim. Allah razı olsun. Bana da kod olarak gerekliydi sağolun.
_a.jade_
Üye
Mesajlar: 4
Kayıt: 25 Nis 2006 10:10

Mesaj gönderen _a.jade_ »

ulu coder yazdı: renk:=ColorToRGB(Image1.Canvas.Pixels[x,y]);
kir:=renk div 65536;
renk:=renk mod 65536;
yes:=renk div 256;
mav:=renk mod 256;
gri:=(kir+yes+mav)div 3;
//if gri<128 Then gri:=0 Else gri:=255;// sadece siyah beyaz olması için bunu da kullan
Image1.Canvas.Pixels[x,y]:=RGB(gri,gri,gri);

bir ricam daha var bana kodun bu parçasını biraz açıklarsanız çok sevinirim. Sonuçta ilk defa karşılaştım anlamam için teşekkürler.
Kullanıcı avatarı
tuanna
Üye
Mesajlar: 582
Kayıt: 06 Ara 2004 05:01
Konum: Ankara
İletişim:

Mesaj gönderen tuanna »

var
bmp:tbitmap;
begin
bmp:=tbitmap.create;
try
bmp.pikselformat:=pf1bit;// bu aşamada resmin biti ile ayarla
finally
bmp.free
end;
end;
Kullanıcı avatarı
Opt2000
Üye
Mesajlar: 216
Kayıt: 09 Tem 2003 10:04

Mesaj gönderen Opt2000 »

Selam,

Kodun açıklaması aslında basit. Senin Pixels ile aldığın değer, sırayla RGB değerleri. Bunların her biri bir byte (24 bit). Ve yanyana konulduğu için de sadece kırmızı değerini istiyorsan, aslında bu 24 bitlik serinin 16-24 arasını alman gerekiyor. Burada yapılan bölme ve mod işlemleri bunu elde etmek için. Aslında en doğrusu bu işlemleri bitwise operatörleri ile yapmak. Yani kırmızı için

Kod: Tümünü seç

Kir := renk shl 16;
dediğinizde aynı sonuca ulaşıyorsunuz. Bitwise kullanmanın nedeni ise hız, bilgisayarlar bitwise işlemlerinde çok daha hızlı çalışıyorlar. Yeşil ve mavi için ise önce AND ile işleme sokmak gerekiyor (Tabii başka yöntemler de türetilebilir).

Bu arada eğer resmin tamamını siyah-beyaza çevirmek istiyorsan, bu işi Canvas'la yapmak çok yavaş olacaktır. Forumda scanline'ı aratacak olursan, hem yukarıdaki kodu yazman gerekmeyecek, hem de çok daha hızlı işlem yapacaksın.

Kolay gelsin,
Bahadır Alkaç
ulu coder
Üye
Mesajlar: 838
Kayıt: 01 Nis 2006 06:46
Konum: Ankara

Mesaj gönderen ulu coder »

_a.jade_ yazdı:
ulu coder yazdı: renk:=ColorToRGB(Image1.Canvas.Pixels[x,y]);
kir:=renk div 65536;
renk:=renk mod 65536;
yes:=renk div 256;
mav:=renk mod 256;
gri:=(kir+yes+mav)div 3;
//if gri<128 Then gri:=0 Else gri:=255;// sadece siyah beyaz olması için bunu da kullan
Image1.Canvas.Pixels[x,y]:=RGB(gri,gri,gri);

bir ricam daha var bana kodun bu parçasını biraz açıklarsanız çok sevinirim. Sonuçta ilk defa karşılaştım anlamam için teşekkürler.
Bir de ben açıklayayım.
1-: image1.Canvas.Pixels[x,y], x,y noktasındaki RGB değerini verir (Renkler kırmızı, yeşil mavi tonları olarak kaydedilir. Buna da EGB değeri denebilir). ColorToRGB ile, bu değeri integer'a çevirttim.
2-:integer'a şu şekilde çevrilir: Kırmızı değeri *256*256 + Yeşil değeri*256 + Mavi. 2,3,4 ve 5. satırlarda, integer'ı renk değerlerine ayırdım. Sonra bu renklerin ortalamasını aldım.
Kırmızı, yeşil ve mavi aynı oranda olduğunda gri tonlarını verdiği için, siyah beyaza çevirmiş oldum. Sonra da noktayı yeni değeriyle boyadım.

Örnek olarak;
beyaz 255,255,255 dir.
Bilgisayar bunu 255*256*256+255*256+255=16777215 olarak kaydeder.
renk = 16777215;
kir = 16777215 div 256*256 = 255
renk = 16777215 mod 256*256 = 65535
yesil = renk div 256 = 65535 div 256 = 255;
mav = renk div 256 = 65535 mod 256 = 255;

Görüldüğü üzere bilgisayar bi hayli yorulmakta, tavsiye etmiyorum ama ben olsam böyle yaparım. Her işi comp. ile yaparsak bize kim neden coder desin?

Not: div, kalansız bölme yapar. Örnek 10/3 = 3,3333 => 3
_a.jade_
Üye
Mesajlar: 4
Kayıt: 25 Nis 2006 10:10

Mesaj gönderen _a.jade_ »

İyi günler ve yardımlarınız için teşekkür ederim(özelliklede 'ulu coder').kod ve açıklama için.tekrara tekrar yardımları dokunan herkese.
Arada sorular sorup başınızı yeniden ağrıtabilirim.
Akin_Delphi
Üye
Mesajlar: 163
Kayıt: 06 Nis 2006 12:22

Mesaj gönderen Akin_Delphi »

ulu coder yazdı:beyaz 255,255,255 dir.
Bilgisayar bunu 255*256*256+255*256+255=16777215 olarak kaydeder.
Sayın ulu coder ben de işin yukarıdaki kısmını anlamadım. Eğer Beyaz 255,255,255 ise niye bilgisayar 255*256*256+255*256+255 olarak kaydetsin. Açıklayabilirseniz sevinirim.

Cahilliğimden soruyorum kusura bakmayın.
Saygılarımla
Cevapla