image'in rengi nasil degisitiririm
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
image'in rengi nasil degisitiririm
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.
Kodla yapmak istersen;
Sadece bmp uzantılı dosyaları dönüştürüyor.
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;
-
- Üye
- Mesajlar: 163
- Kayıt: 06 Nis 2006 12:22
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.
gibi bir şeyler olması lazım.
Saygılar ve Başarılar.
Not :

ö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;
Saygılar ve Başarılar.
Not :
Sayın Ulucoder, bir keresinde ben de size hocam diye hitap etmiştim. Kusura bakmayın. Bir daha olmaz.Bu kullanıcıya hocam dediğinizde kendini kötü hissediyor, kızarıp bozarıyor.


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.
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
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ç
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;
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ç
Bir de ben açıklayayım._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.
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
-
- Üye
- Mesajlar: 163
- Kayıt: 06 Nis 2006 12:22
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.ulu coder yazdı:beyaz 255,255,255 dir.
Bilgisayar bunu 255*256*256+255*256+255=16777215 olarak kaydeder.
Cahilliğimden soruyorum kusura bakmayın.
Saygılarımla