1

スキャンした画像を読み込んで、メモリ内のDIBからTIFファイルに圧縮しようとしています。私はlibtiffライブラリを使用していて、オンラインでいくつかの例を見つけましたが、必要なものはどれも実際にはありません。DIBから画像を取得し、それを白黒画像に変換する必要があります。

これが私がオンラインの例から変更したコードです。白黒になりますが、スキャン全体ではなく、スキャンの1つのセクションのみが表示されます。どんな助けでもいただければ幸いです。

編集*:グレー画像としてスキャンすると、これが発生することに気づきました。白黒としてスキャンすると、返される画像は完全に黒になります。これが役立つかどうかはわかりません。

// set up the image tags 
TIFFSetField(tif, TIFFTAG_IMAGEWIDTH, w);
TIFFSetField(tif, TIFFTAG_IMAGELENGTH, h);
TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 1);
TIFFSetField(tif, TIFFTAG_COMPRESSION, COMPRESSION_CCITTFAX4);
TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK);
TIFFSetField(tif, TIFFTAG_FILLORDER, FILLORDER_MSB2LSB);
TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, 1);
TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, 1);
TIFFSetField(tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
TIFFSetField(tif, TIFFTAG_RESOLUTIONUNIT, RESUNIT_NONE);
TIFFSetField(tif, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT);

unsigned char * psrc = (unsigned char *)lpBits;
unsigned char * pdst = new unsigned char[(w)];

UINT32 src_index;
UINT32 dst_index;

// now go line by line to write out the image data
for (unsigned int row = 0; row < h; row++ )
{

    // initialize the scan line to zero
    memset(pdst,0,(size_t)(w));

    // moving the data from the dib to a row structure that
    // can be used by the tiff library
    for (unsigned int col = 0; col < w; col++){
        src_index = (h - row - 1) * total_width * bytecount
                                  + col * bytecount;
        dst_index = col;
        pdst[dst_index++] = psrc[src_index+2];
        pdst[dst_index++] = psrc[src_index+1];
        pdst[dst_index] = psrc[src_index];
        result++;
    }

    // now actually write the row data
    TIFFWriteScanline(tif, pdst, row, 0);
}
4

1 に答える 1

0

私は間違っているかもしれませんが、CCITTFAX4エンコーディングの場合、libtiffは1バイトあたり8ピクセルを想定し、画像の幅が8で割り切れない場合は、バイトの終わりまで埋め込まれると思います。

たとえば、画像の幅が150の場合、スキャンラインは150ではなく19バイトにする必要があります。

ここにlibtiffを使用する良い例がありますが、しきい値で色情報を切り取り、1バイトあたり8ピクセルをパックすることは含まれていません。

于 2009-06-15T19:05:07.463 に答える