0

使用 java 和 jna 我调用了一个函数:trace(potrace_bitmap_s)

struct potrace_bitmap_s { 
int w, h; 
int dy; /* scanline offset in words */
potrace_word *map; /* pixel data, dy*h words */
};
typedef struct potrace_bitmap_s potrace_bitmap_t;

w, h: 位图的宽度和高度

在图书馆的文档中发现了这个

这里,potrace_word 是在 potracelib.h 中定义的无符号整数类型。它通常等于本机机器字(即,32 位架构上的 32 位)。在下面的解释中,我们假设 potrace_word 类型包含 N 位。

尺寸为 w*h 的位图从下到上被划分为 h 个水平扫描线。每条扫描线从左到右划分为 N 个像素块。每个这样的 N 像素块存储为单个 potrace_word,块的最左边的像素对应于该字的最高有效位,而该块的最右边的像素对应于该字的最低有效位。“开”(或“黑”或“前景”)的像素由位值 1 表示。“关”(“白”或“背景”)的像素由位值 0 表示。如果扫描线中的位不能被 N 整除,则扫描线最右边的字在右边用零填充。扫描线 0(最底部的扫描线)的数据从 map[0] 开始。扫描线 1 的数据从 map[dy] 开始。扫描线 2 的数据从 map[2*dy] 开始,依此类推。请注意,dy 可以是正数或负数,具体取决于应用程序希望如何在内存中布置图像数据。

但我不明白如何在 java map 中表示。

public class Potrace_bitmap_t extends Structure{
    int w, h; /* width and height, in pixels */
    int dy; /* scanline offset in words */
    map ??; /* pixel data, dy*h words */
}
4

1 回答 1

1

这是存储 2 色图像的一种非常标准的方法,就像您从传真编码的 tiff 中获得的一样。“地图”应该是一个无符号 32 位整数数组。我认为 Java 不允许您声明 uint32,但在这种情况下并不重要,因为您关心的只是位。

将“Map”声明为整数数组。要将其制作成图像,您可以一次检查一个数组中的位。如果数组中第一个 int 的位 0(我假设是 Intel 机器)为“1”,则图像左下角的像素应设置为黑色。如果它是“0”,则将该像素设置为白色。每个 int 将为您提供 32 个像素。如果图像的宽度不能被 32 整除,则需要向前跳过。这就是“map[2*dy]”告诉你的。

因此,例如,如果图像宽度为 55,则使用 map[0] 设置 32 个像素,然后使用 map[1] 设置 23 个像素,然后从图像的下一行(靠近底部的行)开始地图[2]的第一位。(对于 55 像素宽的图像,dy 为 2,假设为 32 位整数)

循环执行此操作,图像底部到高度值。

于 2009-06-02T14:36:23.687 回答