6 Nisan 2018 Cuma

Awt BufferedImage Sınıfı

Giriş
Şu satırı dahil ederiz.
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
Soyut Image sınıfından kalıtır.

constructor
Şöyle yaparız.
File f = new File("C:\\sample.png");
BufferedImage img = ImageIO.read (f);
constructor - width + height + type  
Şöyle yaparız.
BufferedImage img = new BufferedImage(cols, rows,BufferedImage.TYPE_BYTE_GRAY);
Şöyle yaparız.
BufferedImage img = new BufferedImage(cols, rows,BufferedImage.TYPE_INT_RGB);
Şöyle yaparız.
BufferedImage img = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
createGraphics metodu
Nesneye çizmek için Graphics döndürür. Şöyle yaparız.
Graphics g = img.createGraphics ();
getAlphaRaster metodu
Şöyle yaparız.
boolean hasAlphaChannel = img.getAlphaRaster() != null;
getGraphic metodu - BufferedImage
RGB olan bir resimden ARGB olan yeni bir nesne kurmak için şöyle yaparız.
BufferedImage b2 = new BufferedImage(img.getWidth(), img.getHeight(),
  BufferedImage.TYPE_INT_ARGB);
b2.getGraphics().drawImage(img, 0, 0, null);
getHeight metodu
Şöyle yaparız.
int height = img.getHeight();
Tüm pikselleri dolaşmak için şöyle yaparız.
//iterate over every pixel..
for (int y = 0; y < img.getHeight(); y++) {
  for (int x = 0; x < img.getWidth(); x++) {
    int(color img.getRGB(x, y);
    ...
  }
}
getRaster metodu
Şöyle yaparız.
BufferedImage image = ...;      
byte[] data =((DataBufferByte) image.getRaster().getDataBuffer()).getData();
Şöyle yaparız.
byte[] data = ...;
BufferedImage img = new BufferedImage(cols, rows,BufferedImage.TYPE_BYTE_GRAY);
img.getRaster().setDataElements(0, 0, cols, rows, data);
Örnek
Tüm pixelleri almak için şöyle yaparız. getRGB metodunun matris döndüren hali gibi düşünülebilir.
private static int[][] convertTo2DWithoutUsingGetRGB(BufferedImage image) {

  final byte[] pixels = ((DataBufferByte) image.getRaster().getDataBuffer()).getData();
  final int width = image.getWidth();
  final int height = image.getHeight();
  final boolean hasAlphaChannel = image.getAlphaRaster() != null;

  int[][] result = new int[height][width];
  if (hasAlphaChannel) {
    final int pixelLength = 4;
    for (int pixel = 0, row = 0, col = 0; pixel < pixels.length; pixel += pixelLength){
      int argb = 0;
      argb += (((int) pixels[pixel] & 0xff) << 24); // alpha
      argb += ((int) pixels[pixel + 1] & 0xff); // blue
      argb += (((int) pixels[pixel + 2] & 0xff) << 8); // green
      argb += (((int) pixels[pixel + 3] & 0xff) << 16); // red
      result[row][col] = argb;
      col++;
      if (col == width) {
        col = 0;
        row++;
      }
    }
  } else {
    final int pixelLength = 3;
    for (int pixel = 0, row = 0, col = 0; pixel < pixels.length; pixel += pixelLength){
      int argb = 0;
      argb += -16777216; // 255 alpha
      argb += ((int) pixels[pixel] & 0xff); // blue
      argb += (((int) pixels[pixel + 1] & 0xff) << 8); // green
      argb += (((int) pixels[pixel + 2] & 0xff) << 16); // red
      result[row][col] = argb;
      col++;
      if (col == width) {
        col = 0;
        row++;
      }
    }
}

      return result;
   }
getRGB metodu - int + int
Açıklaması şöyle. Eğer renk değerlerine ayrı ayrı erişmek gerekiyorsa bu yöntem çok verimli olmayabilir.
The getRGB() method combines the alpha, red, green and blue values into one int and then returns the result, which in most cases you'll do the reverse to get these values back.
Eğer resim alpha kanalını destekliyorsa döndürülen değer ARGB şeklindedir. Açıklaması şöyle
Actually, the getRGB and setRGB methods, despite their names, actually returns and accepts a pixel in 32 bit packed ARGB format. That means that if the color model of your BufferedImage actually contains an alpha channel, leaving the alpha values of the pixel empty (0x00) as you do, will result in an all transparent image...
Alpha kanalını etkisiz hale getirmek için şöyle yaparız.
int rgb = 0xff000000 | (r << 16) | (g << 8) | b;
img.setRGB(x, y, rgb);
Örnek
Hız için getRaster() metodu kullanılabilir. Şöyle yaparız.
int width = image.getWidth();
int height = image.getHeight();
boolean hasAlphaChannel = = image.getAlphaRaster() != null;
int pixelLength = 3;
byte[] pixels = ((DataBufferByte) image.getRaster().getDataBuffer()).getData();
if (hasAlphaChannel)
{
  pixelLength = 4;
}

int getRGB(int x, int y)
{
  int pos = (y * pixelLength * width) + (x * pixelLength);

  int argb = -16777216; // 255 alpha
  if (hasAlphaChannel)
  {
    argb = (((int) pixels[pos++] & 0xff) << 24); // alpha
  }

  argb += ((int) pixels[pos++] & 0xff); // blue
  argb += (((int) pixels[pos++] & 0xff) << 8); // green
  argb += (((int) pixels[pos++] & 0xff) << 16); // red
  return argb;
}
Örnek
Şöyle yaparız.
int val = img.getRGB(0, 0);
Örnek
Nesneyi matrise çevirmek için şöyle yaparız.
public int[][] getMatrixOfImage(BufferedImage bufferedImage) {
  int width = img.getWidth(null);
  int height = img.getHeight(null);
  int[][] pixels = new int[width][height];
  for (int i = 0; i < width; i++) {
    for (int j = 0; j < height; j++) {
      pixels[i][j] = img.getRGB(i, j);
    }
  }

  return pixels;
}
getRGB metodu - x + y  + width + height + array + offset + scansize
Nesnenin tüm verisini almak için şöyle yaparız. array olarak null verdiğimiz için offset 0 olur. scansize ise width ile aynıdır.
int height = img.getHeight();
int width = img.getWidth();

int[] raw_pixels = img.getRGB(0, 0, width, height, null, 0, width);
getWidth metodu
Şöyle yaparız.
int width = img.getWidth();
setRGB metodu
Şöyle yaparız.
int val = ...;
img.setRGB(0, 0,val); 




Hiç yorum yok:

Yorum Gönder