• Merhaba Ziyaretçi.
    "Hoşgeldin sonbahar "
    konulu resim yarışması başladı. İlgili konuya BURADAN ulaşabilirsiniz. Sizi de beğendiğiniz 2 resmi oylamanız için bekliyoruz...

[JAVA] Bit Seviyesinde BMP Dosya Okuma-Yazma-Erişme (Sadece 8 Bit Renk İçin)

merakettim

Homo Sapiens Sapiens
Özel üye
BMP dosyalarının çalışma mantığı, bir renk katarı oluşturulur. Örneğin renk tablomuzda 3 farklı renk olsun. Bunlar kırmızı,yeşil ve mavi olsun. Renk katarımız şu şekilde olmalı.


16lık sayı düzleminde ilk 2 basamak mavi, sonraki iki basamak yeşil, sonraki iki basamak kırmızı ve en yüksek 2 basamak saydamlık temsil eder.

renkler[x]=sskkyymm

renkler[0]=00ff0000//kırmızı
renkler[1]=0000ff00//yeşil
renkler[2]=000000ff//mavi


Daha sonra data kısmı bulunur. Bu data kısmı en ve boy'un çarpımı kadardır. 5 piksel en ve 10 piksel boy olsun. Toplamda 5x10=50 adet datamız bulunacak. Bu dataların her biri temsil ettikleri pikselin renginin adresini "renkler" dizimizdeki elemanını gösterir. Mesela ilk satır tamamen mavi, ikinci satır bi mavi bi kırmız bi yeşil ve kırmızı,kırmızı olsun. Son satır ise tamamen yeşil olsun.

data[0]=2;
data[1]=2;
data[2]=2;
data[3]=2;
data[4]=2;

data[5]=2;
data[6]=0;
data[7]=1;
data[8]=0;
data[9]=0;

data[..]=..;

data[45]=1;
data[46]=1;
data[47]=1;
data[48]=1;
data[49]=1;

BMP Dosyası Başlığı


Konumu|Uzunluk|Açıklama
0|2|Bu standarttır. Dosyanın BMP olduğunu belirtir. 0x4D42 olmalıdır.
2|4|BMP dosyasının toplam uzunluğu.(Kaç Bayt)
6|2|Ayrılmış alan 0 olmalıdır.
8|2|Ayrılmış alan 0 olmalıdır.
10|4|Resmin datalarının bulunduğu adresin başlangıcı.
14|4|BMP tanıtım başlık yapısı, 40 olmalıdır.
18|4|Resim genişliği. Piksel bazında.
22|4|Resim yüksekliği. Piksel bazında.
26|2|Görüntüdeki plan sayısı, 1 olmalıdır.
28|2|Piksel başına datada kaç bit ayrılacağı (1, 4, 8, veya 24)
30|4|Sıkıştırma türü (0=sıkıştırma yok, 1=RLE-8, 2=RLE-4)
34|4|Görüntüde kaç data kullanılacağı.
38|4|Metre başına piksel cinsinden yatay çözünürlük.
42|4|Metre başına piksel cinsinden dikey çözünürlük.
46|4|Görüntüdeki renk sayısı.
50|4|Görüntüdeki önemli renk sayısı.

(Tablo ekleyemediğimden karışık oldu. | işaretiyle ayırın :))

BMPDosya.java

Kod:
package bmpfx;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

/**
*
* @author Sercan
*/
public class BMPDosya {
   
    public short tur;
    public int boyut;
    short ayrilmisAlan1;
    short ayrilmisAlan2;
    int dataAdres;
    int info;
    int en;
    int boy;
    short planNumarası;
    short pikselBasinaBit;
    int sikistirma;
    int goruntuVerileriBoyutu;
    int metredeYatayCozunurluk;
    int metredeDikeyCozunurluk;
    int renkSayisi;
    int onemliRenkSayisi;
    int [] renkler;
    byte [] noktalar;
   
   
     private int getNoktaLen(){
   

        return (en*boy)+(boy*3);
    }
   
   
    BMPDosya(String dosya) throws FileNotFoundException, IOException{
       
        FileInputStream okunacakDosya = new FileInputStream(dosya);
       
       byte [] buffer  = new byte[1];
       byte [] buffer2  = new byte[2];
       byte [] buffer4  = new byte[4];
       
    okunacakDosya.read(buffer2, 0, 2);
    tur=(short) ((buffer2[0]*256)+(buffer2[1]*1));
    okunacakDosya.read(buffer4, 0, 4);
    boyut=cevir4(buffer4); 
    okunacakDosya.read(buffer2, 0, 2);
    ayrilmisAlan1=cevir2(buffer2);
   
    okunacakDosya.read(buffer2, 0, 2);
    ayrilmisAlan2=cevir2(buffer2);
    okunacakDosya.read(buffer4, 0, 4);
    dataAdres=cevir4(buffer4);
    okunacakDosya.read(buffer4, 0, 4);
    info=cevir4(buffer4);
    okunacakDosya.read(buffer4, 0, 4);
    en=cevir4(buffer4);
    okunacakDosya.read(buffer4, 0, 4);
    boy=cevir4(buffer4);
    okunacakDosya.read(buffer2, 0, 2);
    planNumarası=cevir2(buffer2);
    okunacakDosya.read(buffer2, 0, 2);
    pikselBasinaBit=cevir2(buffer2);
    okunacakDosya.read(buffer4, 0, 4);
    sikistirma=cevir4(buffer4);
    okunacakDosya.read(buffer4, 0, 4);
    goruntuVerileriBoyutu=cevir4(buffer4);
    okunacakDosya.read(buffer4, 0, 4);
    metredeYatayCozunurluk=cevir4(buffer4);
    okunacakDosya.read(buffer4, 0, 4);
    metredeDikeyCozunurluk=cevir4(buffer4);
    okunacakDosya.read(buffer4, 0, 4);
    renkSayisi=cevir4(buffer4);
    okunacakDosya.read(buffer4, 0, 4);
    onemliRenkSayisi=cevir4(buffer4);
     
    renkler=new int[renkSayisi];

      for(int say=0;say<renkSayisi;say++){
     
      okunacakDosya.read(buffer4,0,4);
      renkler[say]=cevir4(buffer4);
     
      }
     
     
      int noktaUzunluk=getNoktaLen();
      noktalar=new byte[noktaUzunluk];
     
     
     
      for(int say=0;say<noktaUzunluk;say++){
     
      okunacakDosya.read(buffer,0,1);
      noktalar[say]=buffer[0];
     
     
      }
     
       okunacakDosya.close();
   
    }
   
    static private int cevir4(byte [] cevir){
    return (cevir[3]*16777216)+(cevir[2]*65536+(cevir[1]*256)+(cevir[0]*1));
    }
   
    static private short cevir2(byte [] cevir){
    return (short) ((cevir[1]*256)+(cevir[0]*1));
    }
   
    public void kaydet(String dosya) throws IOException{
       
        byte [] buffer  = new byte[1];
       byte [] buffer2  = new byte[2];
       byte [] buffer4  = new byte[4];
       int n = 0;
       
       
        File yazilacak = new File(dosya);
        if (!yazilacak.exists()) {
            yazilacak.createNewFile();
        }
        OutputStream yazilacakDosya= new FileOutputStream(yazilacak,false);
       
       
       
      yazilacakDosya.write(shortToByteArray(tur), 0, 2);
     
      yazilacakDosya.write(tersCevir4(intToByteArray(boyut)), 0, 4);
      yazilacakDosya.write(tersCevir2(shortToByteArray(ayrilmisAlan1)), 0, 2);
      yazilacakDosya.write(tersCevir2(shortToByteArray(ayrilmisAlan2)), 0, 2);
      yazilacakDosya.write(tersCevir4(intToByteArray(dataAdres)), 0, 4);
      yazilacakDosya.write(tersCevir4(intToByteArray(info)), 0, 4);
      yazilacakDosya.write(tersCevir4(intToByteArray(en)), 0, 4);
      yazilacakDosya.write(tersCevir4(intToByteArray(boy)), 0, 4);
      yazilacakDosya.write(tersCevir2(shortToByteArray(planNumarası)), 0, 2);
      yazilacakDosya.write(tersCevir2(shortToByteArray(pikselBasinaBit)), 0, 2);
      yazilacakDosya.write(tersCevir4(intToByteArray(sikistirma)), 0, 4);
      yazilacakDosya.write(tersCevir4(intToByteArray(goruntuVerileriBoyutu)), 0, 4);
      yazilacakDosya.write(tersCevir4(intToByteArray(metredeYatayCozunurluk)), 0, 4);
      yazilacakDosya.write(tersCevir4(intToByteArray(metredeDikeyCozunurluk)), 0, 4);
      yazilacakDosya.write(tersCevir4(intToByteArray(renkSayisi)), 0, 4);
      yazilacakDosya.write(tersCevir4(intToByteArray(onemliRenkSayisi)), 0, 4);
   
       for(int say=0;say<renkSayisi;say++)
       yazilacakDosya.write(tersCevir4(intToByteArray(renkler[say])), 0, 4);

       
     
      yazilacakDosya.write(noktalar, 0, noktalar.length);
 
       
       
        yazilacakDosya.close();
   
       
    }
   
     public byte[] shortToByteArray(int value) {
    return new byte[] {
            (byte)(value >>> 8),
            (byte)value};
}
   
    public byte[] intToByteArray(int value) {
    return new byte[] {
            (byte)(value >>> 24),
            (byte)(value >>> 16),
            (byte)(value >>> 8),
            (byte)value};
}

     static public byte[] tersCevir4(byte [] cevir){
    return new byte[] {
            (byte)(cevir[3]),
            (byte)(cevir[2]),
            (byte)(cevir[1]),
            (byte)cevir[0]};
    }
   
    static public byte[] tersCevir2(byte [] cevir){
    return new byte[] {
            (byte)(cevir[1]),
            (byte)cevir[0]};
    }
   
   
}

Sınıf Çağrısı

Kod:
BMPDosya bmp=new BMPDosya("okunan.bmp");

       bmp.renkler[1]=0x000000ff;       
       bmp.noktalar[0]=1;
       bmp.kaydet("degistirilen.bmp");
 
Geri
Top