Sponsor Reklam 


09.01.2009 (02:03)

 Java'da PGM Formatında Resim Okuma ve Yazma 
PGM (Portable Gray Map File) dosya formatı, gri seviyeli resimler için kullanılan bir formattır. Resimden okuma ve resme okuma işlemleri kolay bir şekilde yapılmaktadır. Dosya header ve data olmak üzere iki kısımdan oluşur. header içerisinde resmin formatı, resme ait yükseklik, genişlik ve derinlik bilgileri bulunur. Bundan sonraki kısım ise her piksellerin gri seviyesindeki renk değerleridir. byte halinde tutulabilen bu veriler derinliğe göre sayılardır. 255 derinlikli veya seviyeli resimde bu değerler 255'ten büyük olamaz.

255 gri seviyeli PGM resimlerde 0 rengi siyahı, 255 rengi ise beyazı temsil etmektedir ve toplam 256 renk bulunmaktadır. 0-255 arası değerler gri renkleri temsil etmektedir.

Java ile PGM formatında resmi okumak için resmin içindeki bilgilerin byte byte okunması ve değerlendirilmesi gerekmektedir.

header verisi okunduktan sonra header'ın atlanması için okuma işleminde kullanılan DataInputStream'ın skipBytes(int) veya kalıtım yoluyla devraldığı skip(long) metodundan faydalanılabilir.

StringTokenizer sınıfının nesnesi üretilerek header içinde satırlardaki boyut bilgileri integer (tam sayı) olarak parse edilebilir.

data kısmı ise header kısmı atlandıktan sonra piksellerin değerleri readUnsignedByte() metodu ile okunabilir.

PGM formatındaki resmin okunması ve yazılması ile ilgili bir kopyalama örneği yapalım.

Okunacak dosya: C://kodcu.net.oku.pgm (read)
Yazılacak dosya: C://kodcu.net.yaz.pgm (write)

Main.java
package kodcu.net;

public class Main {

  public static void main(String[] args) {

    Image image = new Image();
    // PGM resmi okunur
    image.readPGM("C://kodcu.net.oku.pgm");
    // PGM resmi yazilir
    image.writePGM("C://kodcu.net.yaz.pgm"); 

  }

}

Image.java
package kodcu.net;

import java.util.StringTokenizer;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.DataOutputStream;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;

public class Image {
  private int[][] pixels;
  private int depth;
  private int width;
  private int height;
  private int maximum;
  private int minimum;

  // Constructor
  public Image() {
    pixels = new int[1500][1500];
    depth = width = height = 0;
  }

  // Constructor
  public Image(int inDepth, int inWidth, int inHeight) {
    pixels = new int[inWidth][inHeight];
    width = inWidth;
    height = inHeight;
    depth = inDepth;
  }

  // Constructor
  public Image(Image img) {
    this.width = img.width;
    this.height = img.height;
    this.depth = img.depth;
    this.maximum = img.maximum;
    this.minimum = img.minimum;
    this.pixels = new int[width][height];
    for (int i = 0; i < this.width; i++)
      for (int j = 0; j < this.height; j++)
        this.pixels[i][j] = img.pixels[i][j];
  }

  /**
  * PGM resmini okumayi saglar
  * @param fileName String
  */

  public void readPGM(String fileName) {
    String line;
    StringTokenizer st;

    try {
      BufferedReader in =
          new BufferedReader(new InputStreamReader(
          new BufferedInputStream(
          new FileInputStream(fileName))));

      DataInputStream in2 =
          new DataInputStream(
          new BufferedInputStream(
          new FileInputStream(fileName)));

      // PGM resim header oku

      // yorumlari atla
      line = in.readLine();
      in2.skip( (line + "\n").getBytes().length);

      // PGM resim formati kontrolu
      if (line.equals("P5")) {
        // yorumlari atla
        do {
          line = in.readLine();
          in2.skip( (line + "\n").getBytes().length);
        }
        while (line.charAt(0) == '#');

        // bu satir boyut bilgisini icerir
        st = new StringTokenizer(line);
        width = Integer.parseInt(st.nextToken());
        height = Integer.parseInt(st.nextToken());

        // diger satir resmin derinligini verir
        line = in.readLine();
        in2.skip( (line + "\n").getBytes().length);
        st = new StringTokenizer(line);
        depth = Integer.parseInt(st.nextToken());

        // okunacak dosya icin piksels dizisi implemente edilir
        pixels = new int[width][height];

        // pikseller simdi okunur
        for (int y = 0; y < height; y++) {
          for (int x = 0; x < width; x++) {
            pixels[x][y] = in2.readUnsignedByte();

          }
        }
        in.close();
        in2.close();

      }
      else {
        System.out.println("Hata: resim PGM degil");
      }
    }
    catch (ArrayIndexOutOfBoundsException e) {
      System.out.println("Hata: resim cok buyuk");
    }
    catch (IOException e) {
      System.out.println("Hata: IO istisnasi");
    }
  }

  /**
  * PGM resmi olusturur
  * @param fileName String
  */

  public void writePGM(String fileName) {
    try {
      DataOutputStream out =
          new DataOutputStream(
          new BufferedOutputStream(
          new FileOutputStream(fileName)));

      out.writeBytes("P5\n");
      out.writeBytes("#PGM Resim Dosyasi | Kodcu.net\n");
      out.writeBytes(width + " " + height + "\n" + depth + "\n");

      for (int y = 0; y < height; y++) {
        for (int x = 0; x < width; x++) {
          out.writeByte( (byte) pixels[x][y]);

        }
      }
      out.close();
    }
    catch (IOException e) {
      System.out.println("Hata: yazma islemi yapilamadi");
    }
  }

}

Imza: admin








Yazilar kaynak gosterilmeden kopyalanamaz © www.kodcu.net // Twitter