java - 将 XML 位图数据转换为图像

标签 java python image image-processing python-imaging-library

<分区>

我需要从 XML 文件中提取图像数据并将图像输出为单独的文件。

我已经处理了解析,但我不知道如何转换为图像。

XML 看起来像这样:

<Bitmap>
    <BitmapInfo BitWidth="40" BitHeight="40" ByteWidth="8" BitCount="1" ColorCount="2" Compression="true">
        <ColorTable>
            <Color>0</Color>
            <Color>16777215</Color>
        </ColorTable>
        <BitData>Af5/+/8B/h/7/wH+B/v/Af4B+/8C/gB//P8C/gAf/P8C/gAH/P8C/gAB/P8D/gAAf/3/A/4AAB/9/wP+AAAH/f8D/gAAAf3/AP7+AAB//v8A/v4AAB/+/wD+/gAAB/7/AP7+AAAD/v8A/v4AAAf+/wD+/gAAH/7/AP7+AAB//v8D/gAAAf3/A/4AAAf9/wP+AAAf/f8D/gAAf/3/Av4AAfz/Av4AB/z/Av4AH/z/Av4Af/z/Af4B+/8B/gf7/wH+H/v/Af5/s/8=</BitData>
    </BitmapInfo>
    <Area Left="4430000" Top="12690000" Right="4563333" Bottom="12823333" />
</Bitmap>

另一个例子:

<Bitmap>
    <BitmapInfo BitWidth="24" BitHeight="14" ByteWidth="4" BitCount="1" ColorCount="2" Compression="true">
        <ColorTable>
            <Color>0</Color>
            <Color>16777215</Color>
        </ColorTable>
        <BitData>/f8u8+c5//PnOf/z5hn/8+bZ//Pm2f/z5Mn/8+Xp//Pl6f/z4eH/8+Px/4Bj8f8AM/n8/w==</BitData>
    </BitmapInfo>
    <Area Left="1043333" Top="13360000" Right="1123333" Bottom="13406667" />
</Bitmap>

有关如何着手执行此操作的任何指示都会有所帮助。

最佳答案

在 Java 中,使用 javax.imageio,你可以这样做:

public void writeImageFile(String data, int imgWidth, int imgHeight, int byteWidth, int bitCount, int colorCount, int[] colors, String fileName) throws IOException {
    byte[] interleavedRGB = getColorTable(colors);
    new IndexColorModel(bitCount, colorCount, interleavedRGB, 0, false);
    BufferedImage buffImg = new BufferedImage(imgWidth, imgHeight, BufferedImage.TYPE_BYTE_INDEXED);
    WritableRaster raster = buffImg.getRaster();
    byte[] uncompressed = uncompress(decodeBase64(data), byteWidth);
    int pixels = imgHeight * imgWidth;
    for (int pos = 0; pos < pixels; pos += bitCount) {
        int y = pos % imgWidth;
        int x = pos / imgHeight;
        raster.setSample(x, y, 0, getValue(uncompressed, pos, bitCount));
    }
    ImageIO.write(buffImg, "png", new File(fileName));
}

您需要转换颜色表以提取 RGB 值。这些看起来像没有 alpha 的每 channel 8 位 RGB 值。该方法可能看起来像

private byte[] getColorTable(int[] colors) {
    int colorCount = colors.length;
    byte[] interleavedRGB = new byte[colorCount * 3];
    for (int i = 0; i < colorCount - 1; i++) {
        interleavedRGB[i * 3] = (byte) ((colors[i] & 0xFF0000) >> 16);
        interleavedRGB[i * 3 + 1] = (byte) ((colors[i] & 0x00FF00) >> 8);
        interleavedRGB[i * 3 + 2] = (byte) (colors[i] & 0x0000FF);
    }
    return interleavedRGB;
}

此外,您还需要实现解码和解压缩数据的方法,以及从未压缩数据的特定位置获取值(颜色索引)的方法。

abstract byte[] decodeBase64(String encoded);
abstract byte[] uncompress(byte[] compressed, int byteWidth);
abstract int getValue(byte[] uncompressed, int pos, int bitCount);

如果您没有任何文档,那么解压缩方法尤其需要一些逆向工程。查看这两个示例中的解码数据,很可能是一些使用字节宽度的运行长度编码值。有几个RLE variants ,我无法导出对我来说有意义的图像数据,但我对图像数据的意图一无所知,因此我可能无法正确识别未压缩的数据。

对于第一个示例,我意识到数据有 1600 位长。给定图像宽度和高度分别为 40 和颜色深度为 1 位,这也可以不压缩,即使 XML 表示它会被压缩。

关于java - 将 XML 位图数据转换为图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53889478/

相关文章:

javascript - 使用语义 UI React 将 SVG 渲染为图像

android - 使用 ACTION_IMAGE_CAPTURE 拍照并 setImageBitmap 来显示它

python - Alembic 和枚举类型

python - 如何从链接/距离矩阵计算集群分配

java - DocuSign 异常处理

java - 检查 String 是否只包含这些字符 {([])}

python - 谷歌 NDB : Adding an entity with non existing parent

javascript - 仅当用户单击提交 html 表单时,纯 javascript 中的进度图像加载器

使用套接字上传Java文件,需要上传文件的百分比?

java - 注入(inject) Guice 的 DAO 应该是单例吗?