C++ BMP Yazma

Ahbap

Harbi Üye
Forum Üyesi
Katılım
29 Mayıs 2019
Mesajlar
8,562
Tepkime puanı
2
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 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:
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:
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--;        }
 
Benzer konular Forum Tarih
Kurtbeyi C ve C++ 2 191
Kurtbeyi C ve C++ 1 189
Kurtbeyi C ve C++ 2 170
Kurtbeyi C ve C++ 1 188
Ahbap C ve C++ 4 258

Benzer konular

DarK

< MasaLFM.Net >
Forum Üyesi
Katılım
1 Nisan 2019
Mesajlar
622
Tepkime puanı
0
emeğine yüreğine sağlık
 

Nutella

Harbi Üye
Bayan Üye
Özel Üye
Katılım
2 Ocak 2021
Mesajlar
9,432
Tepkime puanı
8
Cinsiyet
  1. Bayan
Takım
Galatasaray
Paylaşım için teşekkürler.
 
İçerik sağlayıcı "paylaşım" sitelerinden biri olan Harbimekan.Com Forum, Eğlence ve Güncel Paylaşım Platformu Adresimizde 5651 Sayılı Kanun’un 8. Maddesine ve T.C.K’nın 125. Maddesine göre TÜM ÜYELERİMİZ yaptıkları paylaşımlardan sorumludur. Harbimekan.Com sitesindeki konular yada mesajlar hakkında yapılacak tüm hukuksal Şikayetler için info@harbimekan.com yada iletişim sayfası üzerinden iletişime geçilmesi halinde ilgili kanunlar ve yönetmelikler çerçevesinde en geç 3 Gün (72 Saat) içerisinde Forum yönetimi olarak tarafımızdan gereken işlemler yapılacaktır.

Bu Site, Bilim ve Sağlık Haber Ajansı Üyesidir.

Yığıntı - 8kez - kaynak mağazam - Uğur Ağdaş - genel forum - webp converter