2017-05-01 3 views
0

以下のコードは8ビット深度のグレースケール画像を完全に生成します。 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)では、2つの代替アプローチを比較しています。 – trashgod

答えて

2

あなたは、BPPを掛けなければならない(ピクセルあたりのバイト):

if (widths * heights * bpp != srcData.length) 
  • ビット深度8の場合 - BPPは、16ビットの深さ1
  • ある - BPPは2
  • あります32ビットの深さ - bppは4
+0

ありがとうございます。これを行うと、if文がトリガーされません。しかし、私はotsuメソッドでそれ以上の2進化を行っていますが、結果は不適切です... –

関連する問題