我正在嘗試對我的影像進行閾值處理,但其中一些在轉換為 DataBufferByte 時存在問題。我在這里發布兩種型別的圖片 - 第一種(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 影像的輸出是正確的:

但是第二張圖片拋出例外
執行緒“主”java.lang.ClassCastException 中的例外:java.awt.image.DataBufferInt 無法轉換為 java.awt.image.DataBufferByte
在線
byte[] data = ((DataBufferByte) bufferedImage.getRaster().getDataBuffer()).getData();
問題是什么 ?為什么轉換一個 .jpg 影像沒有問題,但第二個拋出例外?
uj5u.com熱心網友回復:
兩者的格式不同。一個使用 8 位表示顏色,另一個使用 3x8 位(所以 4 個位元組,帶有填充或透明度)?
看著它給出:
image1:JPEG 影像資料,JFIF 標準 1.01,縱橫比,密度 1x1,段長 16,基線,精度 8,449x361,分量 3
image2 :PNG 影像資料,617 x 353,8 位/顏色 RGBA,非隔行掃描
您可以使用getDataType()緩沖區上的方法來獲取顏色表示的大小。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/479046.html
