求助:将PNG转换为自定义Bitmap十六进制字符串
从PNG图像生成特定规则的十六进制字符串
这是「Java中从十六进制字符串生成Bitmap图像」的反向操作,需要将PNG作为输入,转换为符合以下规则的十六进制字符串:
每列像素从下到上读取,每4个像素按照附带的编码方案编码为一个字母/数字(A-F 0-9)。
该位图代码是为硬件开发的十六进制代码。代码中的每个字符控制显示屏上垂直方向的4个虚拟像素。第一个字符控制从左下角开始向上的4个像素,第二个字符控制第一个字符上方的下4个像素,第三个控制第二个上方的下4个像素,第四个控制左侧第一列最上方的4个像素。第五个字符则控制第二列最下方的4个像素,以此类推。
我尝试了以下代码,但无法得到正确结果:
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); } }
示例PNG图像:
该图像应生成的十六进制字符串:
000700070007FFFFFFFF00070007000700000000FFFFFFFFE1C7E1C7E1C7E1C7E00700000000183C787EF0C7E187E187E30F7E1E3C1C00000000000700070007FFFFFFFF00070007000700000000FFFFFFFF00000000FFFFFFFF00FC07E03F00FFFFFFFF000000003FFCFFFEE007E707E7077F3EFF3C0000
我的代码生成的输出:
内容的提问来源于stack exchange,提问作者Gladiator9120
相关产品推荐
相关产品推荐

