IRCForumları - IRC ve mIRC Kullanıcılarının Buluşma Noktası
  sohbet

Yeni Konu aç Cevapla
 
LinkBack Seçenekler Stil
Alt 09 Eylül 2013, 22:18   #1
Çevrimdışı
Kullanıcıların profil bilgileri misafirlere kapatılmıştır.
IF Ticaret Sayısı: (0)
IF Ticaret Yüzdesi:(%)
C++ BMP Yazma




C++ bir BMP resmini açıp her pixelindeki değeri bir matrise atamayı bir önceki yazımda anlatmıştım.Bu yazımda nxn bir matristen nxn boyutunda bir BMP resmi oluşturup kaydeden bir program yazacağız.Bilindiği üzere 24-BMP de renkler 54.bayttan sonra başlar.Yani bizim elimizdeki bu matrisi 54.bayttan sonrasına yazmamız gerekiyor.İlk 54 baytta ise resme ait başlıklar olacaktır.BMP resmi okumak için sadece bazı adresleri okumak yeterliydi ancak yazmak söz konusu ise tüm adreslere olması gereken değeri yazmamız zorunludur.Aksi takdirde görüntüleyici program BMP resmini açamayacaktır.Bu nedenle ilk 54 baytın içerisinde neler olduğunu tek tek bilmemiz gerekmektedir.Aşağıdaki tabloda her adresin içerisinde ne bilgisinin tutulduğu,kaç bit olduğunu ve C++ veri türünü görebilirsiniz.(Burada verilen veri tipleri standart veri tipleridir.Kod içerisinde görülen veri tipleri char=unsigned char,word=unsigned short,dword=unsigned int veri tipleridir.)


Bu forumdaki linkleri ve resimleri görebilmek için en az 25 mesajınız olması gerekir.


Bu değerleri bmp dosyasına yazmamız için öncelikle ofstream ile bir bmp dosyası binary olarak açılır.Açılan bu dosyada imleç seekg ile istenen adrese konumlandırılarak adresde tutmamız gereken değerler yazılır.BMP dosyasının boyutu ve satır uzunluğu resmin yüksekliği ve genişliği cinsinden;
satır_uzunluğu=genişlik+padding=genislik+(4-(3*genislik)%4) dir.Burada padding 4 çıkabilir.Bu durumda padding anlamını yitirir bu yüzden padding=0 alınır.(Ayrıntılı bilgi için bir önceki yazıma bakabilirsiniz.)
dosya_boyutu=satır_uzunluğu*yükseklik+54 bayt dır.İlk 54 baytı yazıldıktan sonra renkler yazılırken dikkat edilmesi gereken bir nokta padding baytlarıdır.Her satır yazıldıktan sonra padding baytı sayısı kadar 0 imlecin bulunduğu yerden itibaren yazılmalıdır.Argüman olarak dosya adını alan ve pixels[m][n] matrisindeki renk değerlerini bu dosyaya bmp formatında kaydeden kod parçası aşağıda verilmiştir.

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
bool BMPF::writebmp(char *filename) { ofstream bmp(filename,ios::binary); int i,j; byte padding=4-(3*bminfo.width)%4; if(padding==4) { padding=0; } byte pad=0; dword row=padding+(bminfo.bppixel*bminfo.width)/8; header.bftype=19778; header.bfsize=(dword)54+row*bminfo.height; header.bfres1=0; header.bfres2=0; header.bfoffset=54; bminfo.bisize=40; bminfo.biplane=1; bminfo.bppixel=24; bminfo.comtype=0; bminfo.rawsize=row*bminfo.height; bminfo.xpmeter=0; bminfo.ypmeter=0; bminfo.ncolors=pow2(bminfo.bppixel); bminfo.icolors=0; bmp.write((char*)&header.bftype,2); bmp.write((char*)&header.bfsize,4); bmp.write((char*)&header.bfres1,2); bmp.write((char*)&header.bfres2,2); bmp.write((char*)&header.bfoffset,4); bmp.write((char*)&bminfo.bisize,4); bmp.write((char*)&bminfo.width,4); bmp.write((char*)&bminfo.height,4); bmp.write((char*)&bminfo.biplane,2); bmp.write((char*)&bminfo.bppixel,2); bmp.write((char*)&bminfo.comtype,4); bmp.write((char*)&bminfo.rawsize,4); bmp.write((char*)&bminfo.xpmeter,4); bmp.write((char*)&bminfo.ypmeter,4); bmp.write((char*)&bminfo.ncolors,4); bmp.write((char*)&bminfo.icolors,4); for(j=bminfo.height-1;j>=0;j--) { for(i=0;i bmp.write((char*)&pixels[i][j],(int) bminfo.bppixel/8); } bmp.write((char*)&pad,(int)padding); } return true; }

Bir önceki yazımda bahsettiğim gibi bu kodlarıda hızlandırmak istersek mavi ile yazılı satırlar yerine aşağıdaki satırları kullanmamız daha mantıklı olacaktır.


Kod:   Kodu kopyalamak için üzerine çift tıklayın!
int buffersize=bminfo.width*3+padding; byte *buffer; buffer=new byte [buffersize]; for(i=0;ibuffer[i]=0; } j=bminfo.height-1; while(j>-1) { for(i=0;i { memcpy( (char*) buffer+3*i, (char*) &(pixels[i][j]), 3 ); } bmp.write((char*)buffer,buffersize); j--; }

Alıntı

 
Alıntı ile Cevapla

IRCForumlari.NET Reklamlar
sohbet odaları sohbet odaları Benimmekan Mobil Sohbet
Cevapla

Etiketler
bmp, yazma


Konuyu Toplam 1 Üye okuyor. (0 Kayıtlı üye ve 1 Misafir)
 
Seçenekler
Stil

Yetkileriniz
Konu Acma Yetkiniz Yok
Cevap Yazma Yetkiniz Yok
Eklenti Yükleme Yetkiniz Yok
Mesajınızı Değiştirme Yetkiniz Yok

BB code is Açık
Smileler Açık
[IMG] Kodları Açık
HTML-Kodu Kapalı
Trackbacks are Kapalı
Pingbacks are Açık
Refbacks are Açık


Benzer Konular
Konu Konuyu Başlatan Forum Cevaplar Son Mesaj
Dosyaya yazma Cemalizim C ve C++ 0 19 Temmuz 2008 15:24