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マップでどのように表現できるかわかりませんでした。

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

これは、ファックスでエンコードされた tiff から得られるもののように、2 色の画像を保存するかなり標準的な方法です。「マップ」は、符号なし 32 ビット整数の配列であると想定されています。Java で uint32 を宣言することはできないと思いますが、この場合は重要ではありません。気にするのはビットだけだからです。

「Map」を整数の配列として宣言します。これを画像にするために、配列内のビットを一度に 1 つずつ調べることができます。配列の最初の int のビット 0 (Intel マシンを想定しています) が「1」の場合、画像の左下隅のピクセルを黒に設定する必要があります。「0」の場合、そのピクセルを白に設定します。各 int は 32 ピクセルになります。画像の幅が 32 で割り切れない場合は、スキップする必要があります。これが「map[2*dy]」が伝えていることです。

したがって、たとえば画像の幅が 55 の場合、map[0] で 32 ピクセルを設定し、次に map[1] で 23 ピクセルを設定してから、画像の次の行 (一番下の隣の行) から始めます。 map[2] の最初のビット。(幅 55 ピクセルの画像の dy は、32 ビット整数を想定すると 2 になります)

これをループで、画像の下部から高さの値まで行います。

于 2009-06-02T14:36:23.687 に答える