我有一个Java程序,它接受ZPL图形十六进制码(.GRF)作为输入,并应该从它生成JPG或PNG图像.我有一个粗略的方法,但它并不完全像预期的那样起作用,我认为这不是正确的道路.

Here是它的外观和行为的示例.

以下是我的项目的详细信息:

Input Hexcode(共1890个字节,图像中每像素行15个字节)

000000000000000000000000000000
000000000000000000000000000000
00000000000000FFE0000000000000
000000000000780003800000000000
000000000003000000180000000000
000000000018000000030000000000
0000000000C0021988006000000000
0000000003000F198F801800000000
0000000008000F199F800600000000
00000000200C0F1998010180000000
00000000400E0D999E01C040000000
0000000103C60D999F03F010000000
000000060FC60FD998031008000000
000000080E460FDD98070306000000
0000001006E32CCF3F07E701000000
0000002003F3EC0007064F60800000
00000040033BC000000E0F60400000
0000018603B80000000F1AE0200000
0000030F01F000000003BBC0100000
0000021B01C000FFC000B78F080000
0000043900001FFFFE00271D840000
0000081FE000FFFFFFE00739820000
0000101EE003FFFFFFF80671810000
0000218E701FFFFFFFFE006C008000
00004307003FFFFFFFFF80C638C000
0000472380FFFFFFFFFFC07C784000
0000876101FEF07FFFFFF03CEC2000
000103C607F1C1C07FFFF811C61000
000101EC0FE30300FFF8FC07E41000
0002187C1FC700C31FFC2F06300800
00063E383F80F0F087FF3383018800
00047F1079003FFEC3FFF381878400
000C6380F200FFFFF3FF89C19E0400
0008F0C1E207FFFFFFFFC0E07C0200
00183CC3C3FFFFFFFFFFE0B0700200
00101F83C31FFFFFFFFFF898600100
00100787803FFFFFFFFFFF88300100
00200107807FFFFFFFFFF98C300080
0020000E80FFFE001FFFFC0E000080
0060001C81FFF80003FFFC0E000080
0040001C83FFE00001FFFE0F0000C0
0040003C87FFC000007FFF0D000040
00C000388BFF801E003FFF89800040
00800038E7FF001F001FFF69800060
00800078C7FE003F000FFF39800020
0080007887FC003F000FFF91C00020
008000F80FF8001F0007FF81C00020
018000F80FF8001E0003FF81C00020
010000F81FF01FFFFF03FFC1C00030
010000D83FFFFFFFFFFFFFC1E00010
010100D83FFC0FFFFE0FFFC3600010
010101C85FF000FFE001FFA2603010
010FE1C49FE0007F8001FF9460FC10
0107C1C71FE0003F8001FF9C607C10
030381C31FE0001F0000FF88607810
030281C23FE0001F0000FF88E06810
030001C03FE0001E0000FF80E00010
030001E03FE0001E0000FF80E00010
030001E03FE0000E0001FF81E00010
030001F03FE0000E0001FF81E00010
030001D05FF0000E0001FF83E00010
030001C84FF0000E0001FF06600010
010001C44FF0001E0003FE44E00010
010000C2CFF8001E0003FE48E00030
018000C187F8001E0007FC70E00030
018000E087FC001F0007FC61C00030
018000E007FE001F000FF841C00030
018000F003FE003F001FF803C00030
0180007003FF003F803FF807C00060
00C0007802FF803F807FE80F800060
00C0003E027FE07F80FFD01F800060
00C0003F023FF07FC1FF903F800060
00E0003CC21FFCFFC7FF10E70000C0
0060001E1E0FFFFFFFFE1F0F0000C0
0060001E060FFFFFFFFC1C1E0000C0
00700C0F0107FFFFFFFC103E000180
003018078007FFFFFFF8007C0E0180
00303007C003FFFFFFF800F8138380
00386F03F003F8FFE3F801F830C300
00187603FC07800C003807F03C4300
001C4C81FFFE00E1E00FFFE0060700
000C1B80FC0007CCFC0007C0638600
000E3C007E001F9F3F000F80300E00
000610703F003E7F9F801F811C1C00
000701D81FC0FCFFE7E07F03061C00
000381588FFFF1FFF3FFFC03003800
0003823087FFE3FFF9FFF801807000
0001C22301FFFFFFFFFFF018C07000
0000E1C630FFFFFFFFFFC03C70E000
0000F00C603FFFFFFFFF802601C000
00007018C00FFFFFFFFE002B03C000
000038308003FFFFFFF80109878000
00001C018000FFFFFFC00788070000
00001E0300001FFFFE00040E0E0000
00000F0601C0007FC00007C01E0000
00000780036000000000E3603C0000
000003C0026000000001B020780000
000001E007CF0300043991C1F00000
000080F80449E00000689803E04000
0001807C0489B230E64CC807C06000
0023203F03993269B244481F003000
0066600F801322618266603E039800
002C4407E0132670E22600FC016C00
00388C03F0026618333C03F00CDE00
00011900FE00444993000FE0106600
000313C07F800478F0003F80303000
000232401FE000000001FF009A1800
0001E67807FE0000000FF800CC0000
00008FD801FFC000007FF004444000
0000091B003FFFC07FFF800666C000
000011160007FFFFFFFC0072F30000
0000031C0800FFFFFFE00099100000
00000210110007FFFC000481880000
0000003011700000000076C0800000
00000020337200000004C244C00000
0000002022674C0001BE8266000000
0000000026674CBE8F04D324000000
0000000066E64CB08204F11C000000
000000002CAA6DB082084180000000
0000000018AA753C82084080000000
0000000000B6352082087C00000000
0000000000363720821B2000000000
0000000000002620C31E0000000000
000000000000063CFB000000000000
000000000000000000000000000000
000000000000000000000000000000

Output Image

转换十六进制码时输出的图像:

enter image description here

My Approach

public static void main(String[] args) {
        String bmpFilePath = "hex_input_image.bmp";
        String pngFilePath = "output.png";

        try {
            // Load the BMP image using ImageIO
            File bmpFile = new File(bmpFilePath);
            if (bmpFile.exists()) {
                BufferedImage bmpImage = ImageIO.read(bmpFile);

                if (bmpImage != null) {
                    // Create a BufferedImage for the PNG image with the same width and height
                    BufferedImage pngImage = new BufferedImage(bmpImage.getWidth(), bmpImage.getHeight(),
                            BufferedImage.TYPE_INT_ARGB);

                    // Convert the BMP image to grayscale (monochrome)
                    for (int y = 0; y < bmpImage.getHeight(); y++) {
                        for (int x = 0; x < bmpImage.getWidth(); x++) {
                            int rgb = bmpImage.getRGB(x, y);
                            int grayValue = (int) (0.299 * ((rgb >> 16) & 0xFF) + 0.587 * ((rgb >> 8) & 0xFF)
                                    + 0.114 * (rgb & 0xFF));
                            int grayColor = (grayValue << 16) | (grayValue << 8) | grayValue;
                            pngImage.setRGB(x, y, grayColor);
                        }
                    }

                    // Save the PNG image to a file
                    ImageIO.write(pngImage, "PNG", new File(pngFilePath));
                    System.out.println("Conversion completed successfully.");
                } else {
                    System.err.println("Failed to load the BMP image.");
                }
            } else {
                System.err.println("BMP file does not exist.");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

Output

Failed to load the BMP image.

Step by step

  • 解析十六进制码:接受用户输入的有效十六进制码.
  • 将十六进制代码转换为RGB值:从十六进制代码中提取红色、绿色、蓝色和Alpha(如果可用)分量.
  • 创建图像:使用RGB值在内存中创建图像.
  • 另存为JPG/PNG:将生成的图像另存为JPG或PNG文件.

Question: How can I achieve my goal of converting this Hexcode to a JPG or PNG file?
Additionally: Is there a specific file format that comes to mind when you see this hexcode?

推荐答案

我不熟悉该协议,但它似乎只使用每个字节的4个最低有效位.

以下是一些示例代码.为简单起见,我对文件字符串进行了硬编码.

import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import java.io.*;

public class Main
{
    // Take 4 bits from each char in s and convert to 4 bytes
    static byte[] stringToByteArray(String s)
    {
        byte[] converted = new byte[s.length() * 4];
        for (int i = 0, j = 0; i < s.length(); i++) {
            byte b1 = (byte)Character.getNumericValue(s.charAt(i));
            for (int mask = 0x8; mask != 0; mask >>= 1) {
                converted[j++] = (byte)((b1 & mask) != 0 ? 0 : 255);
            }
        }
        return converted;
    }
    
    public static void main(String args[])
    {
        String data = "00000000000000000000000000000000000000000000000000000000000000000000000000FFE00000000000000000000000007800038000000000000000000000030000001800000000000000000000180000000300000000000000000000C00219880060000000000000000003000F198F8018000000000000000008000F199F80060000000000000000200C0F199801018000000000000000400E0D999E01C0400000000000000103C60D999F03F010000000000000060FC60FD998031008000000000000080E460FDD980703060000000000001006E32CCF3F07E7010000000000002003F3EC0007064F6080000000000040033BC000000E0F604000000000018603B80000000F1AE02000000000030F01F000000003BBC01000000000021B01C000FFC000B78F0800000000043900001FFFFE00271D8400000000081FE000FFFFFFE007398200000000101EE003FFFFFFF806718100000000218E701FFFFFFFFE006C00800000004307003FFFFFFFFF80C638C0000000472380FFFFFFFFFFC07C7840000000876101FEF07FFFFFF03CEC2000000103C607F1C1C07FFFF811C61000000101EC0FE30300FFF8FC07E410000002187C1FC700C31FFC2F0630080000063E383F80F0F087FF338301880000047F1079003FFEC3FFF381878400000C6380F200FFFFF3FF89C19E04000008F0C1E207FFFFFFFFC0E07C020000183CC3C3FFFFFFFFFFE0B070020000101F83C31FFFFFFFFFF89860010000100787803FFFFFFFFFFF8830010000200107807FFFFFFFFFF98C3000800020000E80FFFE001FFFFC0E0000800060001C81FFF80003FFFC0E0000800040001C83FFE00001FFFE0F0000C00040003C87FFC000007FFF0D00004000C000388BFF801E003FFF8980004000800038E7FF001F001FFF6980006000800078C7FE003F000FFF398000200080007887FC003F000FFF91C00020008000F80FF8001F0007FF81C00020018000F80FF8001E0003FF81C00020010000F81FF01FFFFF03FFC1C00030010000D83FFFFFFFFFFFFFC1E00010010100D83FFC0FFFFE0FFFC3600010010101C85FF000FFE001FFA2603010010FE1C49FE0007F8001FF9460FC100107C1C71FE0003F8001FF9C607C10030381C31FE0001F0000FF88607810030281C23FE0001F0000FF88E06810030001C03FE0001E0000FF80E00010030001E03FE0001E0000FF80E00010030001E03FE0000E0001FF81E00010030001F03FE0000E0001FF81E00010030001D05FF0000E0001FF83E00010030001C84FF0000E0001FF06600010010001C44FF0001E0003FE44E00010010000C2CFF8001E0003FE48E00030018000C187F8001E0007FC70E00030018000E087FC001F0007FC61C00030018000E007FE001F000FF841C00030018000F003FE003F001FF803C000300180007003FF003F803FF807C0006000C0007802FF803F807FE80F80006000C0003E027FE07F80FFD01F80006000C0003F023FF07FC1FF903F80006000E0003CC21FFCFFC7FF10E70000C00060001E1E0FFFFFFFFE1F0F0000C00060001E060FFFFFFFFC1C1E0000C000700C0F0107FFFFFFFC103E000180003018078007FFFFFFF8007C0E018000303007C003FFFFFFF800F813838000386F03F003F8FFE3F801F830C30000187603FC07800C003807F03C4300001C4C81FFFE00E1E00FFFE0060700000C1B80FC0007CCFC0007C0638600000E3C007E001F9F3F000F80300E00000610703F003E7F9F801F811C1C00000701D81FC0FCFFE7E07F03061C00000381588FFFF1FFF3FFFC030038000003823087FFE3FFF9FFF8018070000001C22301FFFFFFFFFFF018C070000000E1C630FFFFFFFFFFC03C70E0000000F00C603FFFFFFFFF802601C00000007018C00FFFFFFFFE002B03C000000038308003FFFFFFF8010987800000001C018000FFFFFFC0078807000000001E0300001FFFFE00040E0E000000000F0601C0007FC00007C01E000000000780036000000000E3603C0000000003C0026000000001B020780000000001E007CF0300043991C1F00000000080F80449E00000689803E040000001807C0489B230E64CC807C060000023203F03993269B244481F0030000066600F801322618266603E039800002C4407E0132670E22600FC016C0000388C03F0026618333C03F00CDE0000011900FE00444993000FE0106600000313C07F800478F0003F80303000000232401FE000000001FF009A18000001E67807FE0000000FF800CC000000008FD801FFC000007FF0044440000000091B003FFFC07FFF800666C000000011160007FFFFFFFC0072F300000000031C0800FFFFFFE0009910000000000210110007FFFC0004818800000000003011700000000076C080000000000020337200000004C244C000000000002022674C0001BE82660000000000000026674CBE8F04D3240000000000000066E64CB08204F11C000000000000002CAA6DB0820841800000000000000018AA753C820840800000000000000000B6352082087C000000000000000000363720821B20000000000000000000002620C31E0000000000000000000000063CFB000000000000000000000000000000000000000000000000000000000000000000000000";
            
        int width = 30 * 4;  // Number of chars per line * 4 bits per char
        int height = 126;    // Number of lines in file

        BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_BINARY);
        img.getRaster().setDataElements(0, 0, width, height, stringToByteArray(data));
        try {
            ImageIO.write(img, "PNG", new File("D:\\temp\\test.png"));
        }
        catch (IOException ex) {
            System.err.println(ex);
        }
    }
}

Output: enter image description here

Java相关问答推荐

是否可以从@ TrustMapping中删除特定方法的基路径?

如何在Javascript中设置文本区域圆角的样式

无法在org. openjfx:javafx—fxml:21的下列变体之间进行 Select

我无法将附件发送到NetBeans之外

使用动态ID从json获取详细信息的Jolt规范

在Java Swing Paint应用程序中捕获快速鼠标移动时遇到困难

Spring @Value default无法计算表达式

Java中将文本拆分为数字或十进制数字和字符串

每次FXMLLoader调用ApplationConext.getBean(类)时创建@Component的新实例

Lombok@Nonnull是否也对供应商有影响?

如果第一位数字和最后一位数字相差超过一位,您将如何获得随机数?

将java.util.Date(01.01.0001)转换为java.time.LocalDate将返回29.12.0000

Java嵌套流查找任意值

用于Java的Visual Studio代码完成不起作用

谷歌应用引擎本地服务器赢得';t在eclipse上运行

Java泛型方法重载

将Optionals/null安全添加到嵌套的flatMap/流

如何在java中从以百分比表示的经过时间和结束日期中找到开始日期

从 Java 17 切换回 Java 8 后出现的问题

Spring Integration SFTP 连接失败 - 无法协商 kex 算法的密钥交换