这是相反的:
create BITMAP image from hex String Java个
我需要接受一个PNG作为输入,并将其转换为十六进制字符串.十六进制字符串的创建方式规范如下:
根据所附的编码方案,从下到上读取每个像素列,并将四个像素编码成字母/数字(A-F 0-9).
位图代码是为硬件开发的十六进制代码.代码中的每个数字控制显示器上四个虚拟像素的垂直部分.第一个代码字母控制从左下角开始向上的四个像素.第二个编码字母控制第一个编码字母上方的下四个像素,第三个编码字母控制第二个编码字母上方的下四个像素,第四个编码字母控制左数第一列中最上面的四个像素.然后,第五个字母控制第二列的底部四个像素,依此类推.
以下是我try 过的方法,但不起作用:-(
public AppResponse<String> getBitmapCode(MultipartFile pngFile) throws IOException {
BufferedImage img = ImageIO.read(pngFile.getInputStream());
int height = img.getHeight();
int width = img.getWidth();
StringBuilder bitmapCode = new StringBuilder();
// Process each column
for (int x = 0; x < width; x++) {
int pixelValue = 0;
// Process each pixel in the column from bottom to top
for (int y = height - 1; y >= 0; y--) {
int rgb = img.getRGB(x, y);
// Check if the pixel is closer to white or black using a threshold
int bit = (getColorDistance(rgb, Color.WHITE) < getColorDistance(rgb, Color.BLACK)) ? 0 : 1;
pixelValue = (pixelValue << 1) | bit;
// Check if 4 pixels have been processed
if ((height - 1 - y) % 4 == 0) {
// Convert the pixel value to the corresponding character
char encodedChar = encodePixelValue(pixelValue);
bitmapCode.append(encodedChar);
pixelValue = 0;
}
}
}
return AppResponse.responseOk("Success", bitmapCode.toString());
}
private static int getColorDistance(int rgb1, Color color2) {
Color color1 = new Color(rgb1 & 0x00FFFFFF); // Remove alpha channel
return (int) Math.sqrt(
Math.pow(color1.getRed() - color2.getRed(), 2) +
Math.pow(color1.getGreen() - color2.getGreen(), 2) +
Math.pow(color1.getBlue() - color2.getBlue(), 2)
);
}
private static char encodePixelValue(int pixelValue) {
if (pixelValue >= 0 && pixelValue <= 9) {
return (char) ('0' + pixelValue);
} else if (pixelValue >= 10 && pixelValue <= 15) {
return (char) ('A' + (pixelValue - 10));
} else {
throw new IllegalArgumentException("Invalid pixel value: " + pixelValue);
}
}
图像应生成如下所示的十六进制:
000700070007FFFFFFFF00070007000700000000FFFFFFFFE1C7E1C7E1C7E1C7E00700000000183C787EF0C7E187E187E30F7E1E3C1C00000000000700070007FFFFFFFF00070007000700000000FFFFFFFF00000000FFFFFFFF00FC07E03F00FFFFFFFF000000003FFCFFFEE007E707E7077F3EFF3C0000