无法将特定图片上的 DataBufferInt 转换为 DataBufferByte
Cannot cast DataBufferInt to DataBufferByte on specific picture(s)
我正在尝试对我的图像进行阈值处理,但其中一些在转换为 DataBufferByte 时遇到问题。我 post 这里有两种类型的图片 - 第一种(test1.jpg 很好,可以转换为 DataBufferByte),第二种(test2.jpg 抛出异常)。
图片:
这是我的代码:
public static void main(String[] args) throws IOException {
System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
BufferedImage bufferedImage = ImageIO.read(new File("/test/test2.jpg"));
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
ImageIO.write(bufferedImage, "jpg", byteArrayOutputStream);
byte[] input = byteArrayOutputStream.toByteArray();
InputStream is = new ByteArrayInputStream(input);
bufferedImage = ImageIO.read(is);
byte[] data = ((DataBufferByte) bufferedImage.getRaster().getDataBuffer()).getData();
Mat mat = new Mat(bufferedImage.getHeight(), bufferedImage.getWidth(), CvType.CV_8UC3);
mat.put(0, 0, data);
Mat mat1 = new Mat(bufferedImage.getHeight(),bufferedImage.getWidth(),CvType.CV_8UC1);
Imgproc.cvtColor(mat, mat1, Imgproc.COLOR_RGB2GRAY);
byte[] data1 = new byte[mat1.rows() * mat1.cols() * (int)(mat1.elemSize())];
mat1.get(0, 0, data1);
Mat dst = new Mat();
Imgproc.adaptiveThreshold(mat1, dst, 255, Imgproc.ADAPTIVE_THRESH_MEAN_C, Imgproc.THRESH_BINARY, 11, 15);
MatOfByte matOfByte = new MatOfByte();
Imgcodecs.imencode(".jpg", dst, matOfByte);
ByteArrayInputStream inputStream = new ByteArrayInputStream(matOfByte.toArray());
bufferedImage = ImageIO.read(inputStream);
ImageIO.write(bufferedImage, "jpg", new File("/test_output/test2.jpg"));
}
test1.jpg 图像的输出是正确的:
但是第二张图片抛出异常
Exception in thread "main" java.lang.ClassCastException:
java.awt.image.DataBufferInt cannot be cast to
java.awt.image.DataBufferByte
第
行
byte[] data = ((DataBufferByte) bufferedImage.getRaster().getDataBuffer()).getData();
有什么问题吗?为什么一张.jpg图片转换没有问题,第二次却抛出异常?
两者的格式不同。一个使用 8 位表示颜色,另一个使用 3x8 位(所以 4 个字节,带填充或透明度)?
看着它给出:
image1 : JPEG图像数据,JFIF标准1.01,纵横比,密度1x1,片段长度16,基线,精度8,449x361,分量3
image2 : PNG 图像数据, 617 x 353, 8-bit/color RGBA, non-interlaced
您可以在缓冲区上使用 getDataType()
方法来获取颜色表示的大小。
我正在尝试对我的图像进行阈值处理,但其中一些在转换为 DataBufferByte 时遇到问题。我 post 这里有两种类型的图片 - 第一种(test1.jpg 很好,可以转换为 DataBufferByte),第二种(test2.jpg 抛出异常)。
图片:
这是我的代码:
public static void main(String[] args) throws IOException {
System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
BufferedImage bufferedImage = ImageIO.read(new File("/test/test2.jpg"));
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
ImageIO.write(bufferedImage, "jpg", byteArrayOutputStream);
byte[] input = byteArrayOutputStream.toByteArray();
InputStream is = new ByteArrayInputStream(input);
bufferedImage = ImageIO.read(is);
byte[] data = ((DataBufferByte) bufferedImage.getRaster().getDataBuffer()).getData();
Mat mat = new Mat(bufferedImage.getHeight(), bufferedImage.getWidth(), CvType.CV_8UC3);
mat.put(0, 0, data);
Mat mat1 = new Mat(bufferedImage.getHeight(),bufferedImage.getWidth(),CvType.CV_8UC1);
Imgproc.cvtColor(mat, mat1, Imgproc.COLOR_RGB2GRAY);
byte[] data1 = new byte[mat1.rows() * mat1.cols() * (int)(mat1.elemSize())];
mat1.get(0, 0, data1);
Mat dst = new Mat();
Imgproc.adaptiveThreshold(mat1, dst, 255, Imgproc.ADAPTIVE_THRESH_MEAN_C, Imgproc.THRESH_BINARY, 11, 15);
MatOfByte matOfByte = new MatOfByte();
Imgcodecs.imencode(".jpg", dst, matOfByte);
ByteArrayInputStream inputStream = new ByteArrayInputStream(matOfByte.toArray());
bufferedImage = ImageIO.read(inputStream);
ImageIO.write(bufferedImage, "jpg", new File("/test_output/test2.jpg"));
}
test1.jpg 图像的输出是正确的:
但是第二张图片抛出异常
Exception in thread "main" java.lang.ClassCastException: java.awt.image.DataBufferInt cannot be cast to java.awt.image.DataBufferByte
第
行byte[] data = ((DataBufferByte) bufferedImage.getRaster().getDataBuffer()).getData();
有什么问题吗?为什么一张.jpg图片转换没有问题,第二次却抛出异常?
两者的格式不同。一个使用 8 位表示颜色,另一个使用 3x8 位(所以 4 个字节,带填充或透明度)?
看着它给出:
image1 : JPEG图像数据,JFIF标准1.01,纵横比,密度1x1,片段长度16,基线,精度8,449x361,分量3
image2 : PNG 图像数据, 617 x 353, 8-bit/color RGBA, non-interlaced
您可以在缓冲区上使用 getDataType()
方法来获取颜色表示的大小。