You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:将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图像:
示例PNG图像

该图像应生成的十六进制字符串:

000700070007FFFFFFFF00070007000700000000FFFFFFFFE1C7E1C7E1C7E1C7E00700000000183C787EF0C7E187E187E30F7E1E3C1C00000000000700070007FFFFFFFF00070007000700000000FFFFFFFF00000000FFFFFFFF00FC07E03F00FFFFFFFF000000003FFCFFFEE007E707E7077F3EFF3C0000

我的代码生成的输出:
代码生成的输出

内容的提问来源于stack exchange,提问作者Gladiator9120

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 20:34:53