首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在xml-file中绘制像素数据的图片

在xml-file中绘制像素数据的图片
EN

Stack Overflow用户
提问于 2022-11-16 16:43:00
回答 2查看 39关注 0票数 0

我用显微镜拍摄粒子的图像。我在一个包含信息的xml文件中获取数据(见文件的摘录),我想知道是否可以使用输入像素来获取粒子的图片。我很困惑它是否是像素数据,因为有些条目也有字母。如果有可能的话,如何才能做到呢?

<particledata FileVersion="1.0"> <data measurement="2022-09-26 13:31:34.4610 0228 Q" product="EQPT" filter="<<DIAMETER_EQPC >= 1E-5>> AND <<DIAMETER_EQPC <= 0.0002>>"/> <particle frame="181" EQPC="5.92777219475097e-05" FERET_MAX="6.16502327208423e-05" FERET_MIN="5.96099987626077e-05" FERET_MEAN="6.09342368979882e-05" SPHERICITY="0.947197455424963" ASPECT_RATIO="0.966906305650574" CONVEXITY="0.956224350205198"> <image width="30" height="30" pixel="0E0000000100090001000B00070002001000060003001200050004001400040005001600030006001800020007001A00020008001A00010009001C0001000A001C0000000B001D0000000C001D0000000D001E0000000E001E0000000F001E00000010001E00000011001E00000012001D00010013001C00010014001C00010015001C00020016001A00020017001A0003001800180004001900160005001A00140006001B00110008001C000E000A001D000900"/> </particle> <particle frame="439" EQPC="1.75112776854003e-05" FERET_MAX="2.70261182554826e-05" FERET_MIN="1.98699995875359e-05" FERET_MEAN="2.33606593187573e-05" SPHERICITY="0.539453245456778" ASPECT_RATIO="0.735214706000371" CONVEXITY="0.635416666666667"> <image width="12" height="10" pixel="0800000001000500010005000500020005000100010003000100020003000100030009000100040004000600040005000100050005000700050004000000060004000800060002000100070002000800070004000200080001000800080002000B0008000100080009000100"/> </particle>

EN

回答 2

Stack Overflow用户

发布于 2022-11-17 01:02:15

虽然这是一种未知的数据格式,但是看起来,16位十六进制格式中的一系列整数坐标(x,y)按顺序存储在小端字节序中。

因此,通过重复(1)获取4个十六进制数字并(2)将它们解析为一个小的endian整数(如下所示),您可能能够获得绘制一个图所需的所有绘图点。

代码语言:javascript
复制
0E 00  -> 0x000e = 14  x0
00 00  -> 0x0000 = 0   y0
01 00  -> 0x0001 = 1   x1 
09 00  -> 0x0009 = 9   y1
:

附录:尝试以编程方式解析它。

如果使用javascript,可以按以下方式解析pixel数据。

代码语言:javascript
复制
const canvas = document.querySelector('canvas');
const ctx = canvas.getContext('2d');
const pixelsData = document.getElementById('pixelsData');
let backup = pixelsData.value;

function parsePixels(pixels) {

    let points = [];
    let matches = String(pixels).matchAll(/([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})/g);
    let m;
    while(!(m = matches.next()).done) {
        const x = parseInt(m.value[2] + m.value[1], 16);
        const y = parseInt(m.value[4] + m.value[3], 16);
        points.push([x, y]);
    }
    return points;
}
function parseIt() {
        
    let rawCoordinates = pixelsData.value;

    let points = parsePixels(rawCoordinates); // [ [x,y], ...]
    if (points.length < 1) return;

    backup = rawCoordinates;
    pixelsData.value = points.map(xy => xy.join("\t")).join("\n");

    // Plot points on the canvas
    ctx.clearRect(0, 0, canvas.width, canvas.height);
    ctx.scale(5, 5);
    points.forEach(xy => { ctx.fillRect(xy[0], xy[1], 1, 1); });
    ctx.resetTransform();
}
function resetIt() {
    pixelsData.value = backup;
    ctx.clearRect(0, 0, canvas.width, canvas.height);
}
代码语言:javascript
复制
canvas {  border: solid silver 1px;}
button {  margin: 8px 0px 8px 0px;}
textarea {  width: 320px;  height: 240px;}
代码语言:javascript
复制
<canvas width="160" height="160"></canvas><br/>
<button onclick="parseIt()">Parse</button> <button onclick="resetIt()">Reset</button> <br/>
<textarea id="pixelsData" >0E0000000100090001000B00070002001000060003001200050004001400040005001600030006001800020007001A00020008001A00010009001C0001000A001C0000000B001D0000000C001D0000000D001E0000000E001E0000000F001E00000010001E00000011001E00000012001D00010013001C00010014001C00010015001C00020016001A00020017001A0003001800180004001900160005001A00140006001B00110008001C000E000A001D000900</textarea>

票数 1
EN

Stack Overflow用户

发布于 2022-11-22 13:05:30

充分赞扬@ardget用于搜索像素数据的格式!我想做一个Python版本,如下所示:

代码语言:javascript
复制
#!/usr/bin/env python3

import re
from PIL import Image
from struct import unpack
from binascii import unhexlify

xml = """<particledata FileVersion="1.0"> <data measurement="2022-09-26 13:31:34.4610 0228 Q" product="EQPT" filter="<<DIAMETER_EQPC >= 1E-5>> AND <<DIAMETER_EQPC <= 0.0002>>"/> <particle frame="181" EQPC="5.92777219475097e-05" FERET_MAX="6.16502327208423e-05" FERET_MIN="5.96099987626077e-05" FERET_MEAN="6.09342368979882e-05" SPHERICITY="0.947197455424963" ASPECT_RATIO="0.966906305650574" CONVEXITY="0.956224350205198"> <image width="30" height="30" pixel="0E0000000100090001000B00070002001000060003001200050004001400040005001600030006001800020007001A00020008001A00010009001C0001000A001C0000000B001D0000000C001D0000000D001E0000000E001E0000000F001E00000010001E00000011001E00000012001D00010013001C00010014001C00010015001C00020016001A00020017001A0003001800180004001900160005001A00140006001B00110008001C000E000A001D000900"/> </particle> <particle frame="439" EQPC="1.75112776854003e-05" FERET_MAX="2.70261182554826e-05" FERET_MIN="1.98699995875359e-05" FERET_MEAN="2.33606593187573e-05" SPHERICITY="0.539453245456778" ASPECT_RATIO="0.735214706000371" CONVEXITY="0.635416666666667"> <image width="12" height="10" pixel="0800000001000500010005000500020005000100010003000100020003000100030009000100040004000600040005000100050005000700050004000000060004000800060002000100070002000800070004000200080001000800080002000B0008000100080009000100"/> </particle>""" 

seq = 0
# Iterate over all <image width=/height=/pixel=> occurrences in xml string
for match in re.finditer('<image width="(\d+)" height="(\d+)" pixel="([0-9A-F]+)"', xml):
    # Extract width, height and pixels
    width, height, pixel = match.groups()
    filename = f'extracted-{seq}.png'
    print(f'Image width: {width}, height: {height} -> {filename}')
    # Make a new, empty, black image the correct size
    im = Image.new('L', (int(width)+1,int(height)+1))

    # Unpack the hideous hex into groups of 4 hexdigits, each a short
    shorts = [pixel[i:i+4] for i in range(0,len(pixel), 4)]
    # print('DEBUG: ', shorts)
    # Convert little-endian short hex string things into integers
    px = [unpack('<H', unhexlify(short))[0] for short in shorts]
    # print('DEBUG: ',px)

    # Put the pixels in the image with white colour - slowly but there are only a few
    for i in range(0, len(px), 2):
        x, y = px[i], px[i+1]
        im.putpixel((x,y), 255)
        # print(f'DEBUG: x={x}, y={y}')

    # Save the image 
    im.save(filename)
    seq += 1

产生两个PNG,如下所示:

代码语言:javascript
复制
-rw-r--r--@    1 mark  staff     1376 22 Nov 13:01 extracted-0.png
-rw-r--r--@    1 mark  staff      861 22 Nov 13:01 extracted-1.png

为增加可见度,略有扩大:

我注意到数据中有0和30的像素位置,给出了31像素的范围,但是图像大小是30。输入数据有一些不一致之处,或者至少我们对它的理解是不一致的。我做的图像比它的尺寸显示的高1像素和宽。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74464204

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档