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();
}
}
画像のメタデータをもっと見てください。それだけでグレースケール画像であるかどうかを判断できるはずです。 –
この[Q&A]の可能な複製(http://stackoverflow.com/q/14358499/230513)では、2つの代替アプローチを比較しています。 – trashgod