glcd uzerinde zoom yapmak

Başlatan Karamel, 18 Temmuz 2014, 08:35:44

Karamel

selam. pc ortaminda fotolari cok basitce +-zoom yapabiliyoruz. peki mcu ile bu islemi kolayca yapabilirmiyiz? elimizde cozunurlugunun ne oldugu onemsiz olan monochrome glcd oldugunu hayal edelim. ekranin orta kisimina 5x7 pixel kullanarak "A" harfini yazdigimizi hayal edelim. simdi ise A harfini 2 kat buyultmek istiyoruz. nasil yapariz? bu isin matematiksel algoritmalari nedir?

Kabil ATICI

#1
Öncelikle işlemcinin görüntün işlemcinin RAM bölgesinde veya harici bir RAM'de olacaktır. Bu olayı kafanızda canlandırmanız için 128x64 matris ekranda pikseller bit bazında saklanırsa 1Kbayt ram ister. 240x128 ekranda ise bu değer 3820 bayttır. Pikselleri bayt yazında saklanırsa zaten bu değerler 8 katına çıkar. Ama buradaki işlemler için yer gerekeceğinden ve bu işlemleri doğrudan bu RAM alanında yapamayacağından iki katı büyüklüğünde bir RAM alanı gerekecektir.
Ram üzerindeki bu değerlerin adreslenmesi ciddi bir matematik isteyecektir.

Bu işi yapan programlar genellikle komşu noktalara bakarak karar verirler. tek renkli sistemlerde komşu noktalara bakarlar ona göre yeni nokta koyarlar.

ooxooo
oxxxoo
xoooxo
xxxxxo
xoooxo
xoooxo
xoooxo

bunu iki kat büyütmek istediğinde sıkıntı yeni noktaların neye konacağıdır. Burada hem dikeyde hem düşeyde yeni noktaların eklenmesi gerektiğidir.

x?x -->xXx
o?o -->oOo
bunlar sonucu belli olanlar
x?o -->?
x?o--->?
bunlar içinde komuşu yukarı ve aşağıdaki noktalara bakılır. 
x      x
? -->x
x      x

o       o
?  -->o
o       o

Bu işlem aynı şekilde yatay büyüme içinde uygulanır.

Yada şuna karar verilir, iki kenarındaki değeri farklı noktanın solundaki ne ise o uygulanır.
o?x --->oox
x?o --->xxo
diğer eksendeki büyütmede üsteki noktaya göre ekleme sistemi uygulanabilir.
o         o
? ---->o
x         x

x      x
?--->x
o      o
ambar7

Karamel

http://en.wikipedia.org/wiki/Image_scaling

Nearest-neighbor interpolation

original size


large size


One of the simpler ways of doubling its size is nearest-neighbor interpolation, replacing every pixel with four pixels of the same color:

The resulting image is larger than the original, and preserves all the original detail, but has undesirable jaggedness. The diagonal lines of the W, for example, now show the characteristic "stairway" shape.

Other scaling methods below are better at preserving smooth contours in the image:


yukarida diyor ki:

resmi ikiye katlamanin basit bir yolu "Nearest-neighbor interpolation" yontemi. bir pixel yerine ayni renkte dort pixel yerlestiriliyormus.

ortaya cikan tablo orginal resimden daha buyukmus. resmin original detaylari korunuyormus ama bu yontemde hos olmayan pruzler olusuyormus. mesela W buyutulunce merdiveni andiran bir sekil olusuyormus.

diger scaling yontemleri daha iyi dis hat sonuclari veriyormus. yani su merdiven gibi olan sey digerlerinde olmuyormus.



yukarida yazan yontem aslinda cokta zor degilmis. 5*7 cuzunurluk yukaridaki yontemle 20*28 olacaktir. pixellerin nerelere gelecekleri zaten belli. convert islemini ramde yapip, 20*28 lik yeni font u direk glcd ye basabiliriz.

yukarida yazdiklarimda bir hata yoksa daha duzgun sonuclar veren yontemleri tartisalim.

Kabil ATICI

5x7'lik alanı her noktaya karşılık 4 nokta ile değiştirerek uygularsan 10x14 olur.Çünkü noktaları yanyana koymuyor.

x  --> x x
          x x

şeklinde yerleştiriyor.

ambar7

kimlenbu

O zaman bir sonraki konu olan "anti aliasing" e de bakarsan yerinde olur. Ayrıca amacın tek font ile istediğin büyüklükte yazı basabilmekse ben olsam hiç kasmam, kod hafızasına/sd karta gömerim ihtiyacım olan fontları.

Karamel

hakilisiniz hocam. ben resmi 4 kat buyultmusum. http://en.wikipedia.org/wiki/Aliasing bu konuyu okudum ama pek birsey anlamadim. aliasing konusu kendi basima anlayabilecegim bir konu degil gibi geldi bana.

Kabil ATICI

@kimlenbu
"anti aliasing" olayını tek renkli ekranlarda uygulayamazsın. O yöntemde komşu olan piksellerin ortalaması alınarak yeni piksel oluşturulur.  Burada ise piksel 1 veya 0 .  Piksel değer bit olarak tanımlanıyor. Piksel değeri bayt olarak tanımlanabilseydi dediğiniz olabilirdi.

Renkli ekranlarda uygulanabilir.
ambar7

z

Tekrenkli ekran ifadesi dersek yanlis olur. Monochrome ekranlarda is gorur. pixellerin 1 bit tanimlandigi ekranlarda is gormez.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Mucit23

CCS nin graphics kütüphaneside font büyütme işlemini aynı şekilde yapıyor. En küçük font 5x7, bir büyüğü 10x14, 15x21 şeklinde gidiyor.