2017-05-01 6 views
0

아래 코드는 이미지 크기를 8 비트 깊이로 완벽하게 생성합니다. 이미지 파일을 16 32 비트 심도 또는 32 비트 심도에서 if 문이 트리거됩니다. 16 비트 및 32 비트 심도 이미지 나 다른 솔루션을 완벽하게 변환하는 다른 방법이 있습니까?아래 코드는 8 비트 심도 이미지에만 적용됩니다. 8 비트 심도 이상의 이미지를 사용하면 if 문이 발생합니다.

package test; 

import java.awt.Color; 
import java.awt.image.BufferedImage; 
import java.awt.image.DataBuffer; 
import java.awt.image.DataBufferByte; 
import java.awt.image.Raster; 
import java.io.File; 
import javax.imageio.ImageIO; 

/** 
* 
* @author sumit 
*/ 
public class Test { 

BufferedImage image; 
int width; 
int height; 

public Test() { 
    try { 
     File input = new File("abc.png"); 
     image = ImageIO.read(input); 
     width = image.getWidth(); 
     height = image.getHeight(); 

     for (int i = 0; i < height; i++) { 

      for (int j = 0; j < width; j++) { 

       Color c = new Color(image.getRGB(j, i)); 
       int red = (int) (c.getRed() * 0.299); 
       int green = (int) (c.getGreen() * 0.587); 
       int blue = (int) (c.getBlue() * 0.114); 
       Color newColor = new Color(red + green + blue, 
         red + green + blue, red + green + blue); 

       image.setRGB(j, i, newColor.getRGB()); 
      } 
     } 

     int widths = image.getWidth(); 
     int heights = image.getHeight(); 

     // Get raw image data 
     Raster raster = image.getData(); 
     DataBuffer buffer = raster.getDataBuffer(); 
     DataBufferByte byteBuffer = (DataBufferByte) buffer; 
     byte[] srcData = byteBuffer.getData(0); 
     if (widths * heights != srcData.length) { 
     System.err.println("Unexpected image data size. Should be greyscale image"); 
      System.exit(1); 
     } 
     File ouptut = new File("grayscale.png"); 
     ImageIO.write(image, "png", ouptut); 

    } catch (Exception e) { 
    } 
    } 

    static public void main(String args[]) throws Exception { 
    Test obj = new Test(); 
    } 

} 
+0

이미지 메타 데이터를 자세히 살펴보십시오. 당신은 그것이 회색조 이미지인지 혼자서 결정할 수 있어야합니다. –

+0

이 [Q & A] (http://stackoverflow.com/q/14358499/230513)의 중복 가능한 두 가지 방법을 비교합니다. – trashgod

답변

2

넌 BPP 곱한다 (픽셀 당 바이트)

if (widths * heights * bpp != srcData.length) 
  • 비트 깊이 8 - BPP는 16 비트 깊이의 1
  • 인 - BPP는 2
  • 인 32 비트 깊이 - bpp는 4
+0

감사합니다. 이렇게하면 if 문을 트리거하지 않습니다. 하지만 난 otsu 방법에 의해 결과가 부적 절한 결과가 추가 이진화하고 있어요 ... –