2009-06-15 4 views
1

スキャンした画像を読み込み、メモリ上のDIBからTIFファイルに圧縮しようとしています。私はlibtiffライブラリを使用しており、オンラインでいくつかの例を見つけましたが、それらのどれも本当に必要としていません。私はDIBから画像を取り出し、それをB & W画像に変換する必要があります。DIBを取ってlibtiffを使ってtifに変換するには

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

EDIT *:灰色のイメージでスキャンするとこの現象が発生します。白黒でスキャンすると、返されるイメージは完全に黒色になります。これが役立つかどうかわかりませんまったく。

// 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); 
} 

答えて

0

私は間違っているかもしれないが、私は画像の幅が幅場合は8

で割り切れない場合CCITTFAX4エンコーディングのlibtiffのためのバイトの最後にパディングバイト当たり8つの画素を、期待していることだと思いますたとえば、画像が150の場合、スキャンラインは150ではなく19バイトにする必要があります。

libtiff hereを使用する良い例がありますが、スレッショルドでカラー情報をカットしてピクセルをパックすることは含まれていません1バイトあたり8。

+0

私はこれをもっと近づけて試しました。私は彼のコードを使用し、25 * 8ではなくw * 8を使用したので、画像は実際には広いですが、今では画像の一部だけではなく全体を見ることができます。しかしそれは非常にゆがんでいる。だから、もし私がバイトごとにピクセル8をパッキングする方法を見つけ出すことができたら、私はこの問題を解決することができるかもしれません、私はちょうどこれを行う方法を知りません。 – netadptr0719

+0

それだけでなく、カラーまたはグレースケール画像で始める場合は、しきい値を適用する必要があります。だから、あなたはwピクセルを通過します。ピクセルの平均値が127以下の場合、対応するビットを0(黒)に設定します。それ以外の場合は1に設定します(白)。しきい値を上または下に調整できますが、通常は127が機能します。ピクセルをパッキングするのは難しいことではありません。行をループして、mod 8を使ってどのビットを設定するか、あるいはあなたのバイトを設定してください。 (mod 8の結果は2、例えば04のバイト)modの結果が7のとき、または128のバイトが次のバイトに移動したとき。 –

+0

これは正しい方向に私を入れて、私はそれを働かせました、ありがとう。 – netadptr0719

関連する問題