Diziler - 19 : Bir pikselin renk kodları nasıl belirtilir.
Önceki örneklerde bir sürü değişken tanımladık, kullanıcıdan değerler atamasını istedik. Bunların hepsi tek bir sayıyla yada karakterle tanımlanmıştı.
Bir resme baktığımızda üzerinde binlerce farklı renkli noktalar görürüz. Bu her bir nokta pixel ismiyle ifade edilir ve her birinin farklı uzaylarda farklı değerleri vardır. En çok bildiğimiz RGB uzayını düşünürsek bir pixelin değerini belirtmek için R(kırmızı), G(yeşil) ve B(mavi) olarak 3 ayrı değer belirtmemiz gerekir. Örneğin 8 bitlik RGB uzayında 3 ana renk şöyle tanımlanır:
Kırmızı : 255, 0 , 0
Yeşil : 0, 255, 0
Mavi : 0, 0, 255
Bu değerleri kullanırken her bir pixel için 3 ayrı değişken mi tutmamız gerekir. Bir resimde alt sol pixele p1 dersem ve kodumda kullanmak istersem; varsayalım değerini değiştirmek istiyorum:
p1_r , p1_g ve p1_b olarak 3 ayrı değişken mi oluşturmam gerekir. Ya da bir fonksiyona parametre olarak geçireceğim. Şu şekilde mi yazarım:
renk_degistir(p1_r, p1_g, p1_b);
Burada biliyoruz ki bu 3 değer bir bütünlük içinde; birbiri ile alakalı değerler. Bu gibi değişkenleri ortak bir değişken ile tanımlayabiliriz. Bu tip değişkenler array yani diziler olarak tanımlanır.
Şimdi yukarıdaki örnek için bir kod yazalım. Önce bir pixel tanımlayalım ve değerini sıfırlayalım. Daha sonra bir fonksiyona gönderip kırmızı renge dönüştürelim. En son da rengini yazdıralım.
Kodu açıklamak gerekirse önce pixel dizisini tanımlıyoruz. Ben unsigned char kullandım çünkü 8 bitlik değerler kullanacağımı biliyorum. {0, 0, 0} ile bir diziyi sıfırlıyorum. Bu bir koruma mekanizması çünkü 0 atamazsak çöp bir değer olacak. Daha sonra bu çöp değer sorun çıkarabiliyor. Örneğin bir if yapısında 0 olması gerekirken 0 değilmiş gibi değerlendirilebiliyor. Burada gerekli olsun olmasın ilk değeri 0 vermeyi doğru buluyorum.
Daha sonra printf ile 0 atadığım pixel dizisini yazdırıyorum. Burada açık bir şekilde yazdım ki bir sonraki yazım şeklinden farkı görülebilsin. Bu diziyi kirmizi_yap fonksiyonuna parametre olarak geçireceğim. Ancak burada fonksiyona bir değişken değil dizi geçirdiğim için fonksiyonun tanımına bir dizi işareti eklemek gerekiyor, []. Fonksiyonun içinde atamalar yapıldıktan sonra bir döngü ile yazdırabilirim çünkü değişen artık sadece indis, değişken isimleri aynı.
Burada dikkat edilmesi gereken bir dizinin ilk indisinin 0 olması. Yani pixel[0] pixel dizisinin ilk değerini gösterir. C dilinde 1. eleman değil 0. eleman diye düşünmemiz gerekiyor. Günlük konuşma diliyle düşünürsek hata yaparız. Tanımlarken ise kaç elemanlı olduğunu söylediğimiz için 3 yazdık:
unsigned char pixel[3] = {0,0,0};
Miktar ile sıra tanımları farklı sadece. 3 adet varsa son eleman 2. oluyor (0. , 1. , 2. şeklinde)
İlk bahsettiğimiz şekilde yazdırmak istesek bir indis ile halletmemiz mümkün değil. Bu değişkenin 100 elemanlı bir dizi olduğunu düşünürsek yine for döngüsü bizi epey bir işten kurtarmış oluyor. Diziler ile döngüler arasındaki bu iş birliğine dikkat çekmek isterim.
Burada pixelin yeni değerini fonksiyonun içinde yazdırdım. Geri dönüp main içinde yazdırmak istersem farklı bir kaç konudan bahsetmek gerekecek. Daha sonra işaretçiler denilen pointerler konusunda örnekleri incelediğimizde bu konudan tekrar bahsederiz.
Bir resme baktığımızda üzerinde binlerce farklı renkli noktalar görürüz. Bu her bir nokta pixel ismiyle ifade edilir ve her birinin farklı uzaylarda farklı değerleri vardır. En çok bildiğimiz RGB uzayını düşünürsek bir pixelin değerini belirtmek için R(kırmızı), G(yeşil) ve B(mavi) olarak 3 ayrı değer belirtmemiz gerekir. Örneğin 8 bitlik RGB uzayında 3 ana renk şöyle tanımlanır:
Kırmızı : 255, 0 , 0
Yeşil : 0, 255, 0
Mavi : 0, 0, 255
Bu değerleri kullanırken her bir pixel için 3 ayrı değişken mi tutmamız gerekir. Bir resimde alt sol pixele p1 dersem ve kodumda kullanmak istersem; varsayalım değerini değiştirmek istiyorum:
p1_r , p1_g ve p1_b olarak 3 ayrı değişken mi oluşturmam gerekir. Ya da bir fonksiyona parametre olarak geçireceğim. Şu şekilde mi yazarım:
renk_degistir(p1_r, p1_g, p1_b);
Burada biliyoruz ki bu 3 değer bir bütünlük içinde; birbiri ile alakalı değerler. Bu gibi değişkenleri ortak bir değişken ile tanımlayabiliriz. Bu tip değişkenler array yani diziler olarak tanımlanır.
Şimdi yukarıdaki örnek için bir kod yazalım. Önce bir pixel tanımlayalım ve değerini sıfırlayalım. Daha sonra bir fonksiyona gönderip kırmızı renge dönüştürelim. En son da rengini yazdıralım.
pixel.c
#include <stdio.h>
void kirmizi_yap(unsigned char pix[]);
int main()
{
unsigned char pixel[3] = {0,0,0};
printf("Pixel p1 = %d %d %d \n",pixel[0], pixel[1], pixel[2]);
kirmizi_yap(pixel);
}
void kirmizi_yap(unsigned char pix[])
{
int i = 0;
pix[0] = 255;
pix[1] = 0;
pix[2] = 0;
printf("Yeni pixel degeri : ");
for(i = 0; i<3; i++)
{
printf("%d ",pix[i]);
}
printf("\n");
}
Kodu açıklamak gerekirse önce pixel dizisini tanımlıyoruz. Ben unsigned char kullandım çünkü 8 bitlik değerler kullanacağımı biliyorum. {0, 0, 0} ile bir diziyi sıfırlıyorum. Bu bir koruma mekanizması çünkü 0 atamazsak çöp bir değer olacak. Daha sonra bu çöp değer sorun çıkarabiliyor. Örneğin bir if yapısında 0 olması gerekirken 0 değilmiş gibi değerlendirilebiliyor. Burada gerekli olsun olmasın ilk değeri 0 vermeyi doğru buluyorum.
Daha sonra printf ile 0 atadığım pixel dizisini yazdırıyorum. Burada açık bir şekilde yazdım ki bir sonraki yazım şeklinden farkı görülebilsin. Bu diziyi kirmizi_yap fonksiyonuna parametre olarak geçireceğim. Ancak burada fonksiyona bir değişken değil dizi geçirdiğim için fonksiyonun tanımına bir dizi işareti eklemek gerekiyor, []. Fonksiyonun içinde atamalar yapıldıktan sonra bir döngü ile yazdırabilirim çünkü değişen artık sadece indis, değişken isimleri aynı.
Burada dikkat edilmesi gereken bir dizinin ilk indisinin 0 olması. Yani pixel[0] pixel dizisinin ilk değerini gösterir. C dilinde 1. eleman değil 0. eleman diye düşünmemiz gerekiyor. Günlük konuşma diliyle düşünürsek hata yaparız. Tanımlarken ise kaç elemanlı olduğunu söylediğimiz için 3 yazdık:
unsigned char pixel[3] = {0,0,0};
Miktar ile sıra tanımları farklı sadece. 3 adet varsa son eleman 2. oluyor (0. , 1. , 2. şeklinde)
İlk bahsettiğimiz şekilde yazdırmak istesek bir indis ile halletmemiz mümkün değil. Bu değişkenin 100 elemanlı bir dizi olduğunu düşünürsek yine for döngüsü bizi epey bir işten kurtarmış oluyor. Diziler ile döngüler arasındaki bu iş birliğine dikkat çekmek isterim.
Burada pixelin yeni değerini fonksiyonun içinde yazdırdım. Geri dönüp main içinde yazdırmak istersem farklı bir kaç konudan bahsetmek gerekecek. Daha sonra işaretçiler denilen pointerler konusunda örnekleri incelediğimizde bu konudan tekrar bahsederiz.
Lucky Club - South Africa - Lucky Club Live
YanıtlaSilLucky Club Casino South Africa. The Lucky Club's online casino is powered by Playtech, and you can play a wide range of luckyclub games from slots, progressive jackpots and