2

こんにちは、私は Libtiff と画像処理にまったく慣れていません。Bitmiracle から Libtiff.net を使用しようとするときに質問があります。

私はいくつかの OJPEG TIFF 画像を持っており、それらを最近の JPEG TIFF に変換したいと考えています。ソースを BMP に変換してから TIFF (圧縮: JPEG、フォトメトリック: RGB) として保存することで実現しましたが、画像のサイズがかなり大きくなります。そこで、サイズを大幅に縮小できる YCbCr のフォトメトリックで圧縮できないかと考えました。

ただし、フォトメトリックを RGB から YCbCr に変更すると、プログラムが機能しなくなります。出力は 8 バイトしかありません (入力は約 400kb です)。画像を TXT として開くと、次のように表示されます。

「Ⅱ*」

私が使用するコードは次のとおりです。

byte[] raster1 = getImageRasterBytes(inputbmp[0], PixelFormat.Format24bppRgb);
tif1.SetField(TiffTag.IMAGEWIDTH, inputbmp[0].Width);
tif1.SetField(TiffTag.IMAGELENGTH, inputbmp[0].Height);
tif1.SetField(TiffTag.COMPRESSION, Compression.JPEG);
tif1.SetField(TiffTag.PHOTOMETRIC, Photometric.YCBCR);
tif1.SetField(TiffTag.ROWSPERSTRIP, inputbmp[0].Height);
//tif1.SetField(TiffTag.JPEGQUALITY, confidence);
tif1.SetField(TiffTag.XRESOLUTION, 200);
tif1.SetField(TiffTag.YRESOLUTION, 200);
tif1.SetField(TiffTag.BITSPERSAMPLE,8);
tif1.SetField(TiffTag.SAMPLESPERPIXEL, 3);
int stride = raster1.Length / inputbmp[0].Height;
convertSamples(raster1, inputbmp[0].Width, inputbmp[0].Height);
for (int i = 0, offset = 0; i < inputbmp[0].Height; i++)
{
    tif1.WriteScanline(raster1, offset, i, 0);
    offset += stride;
}

WriteScanline が YCbCr 出力を処理できるかどうかはよくわかりません。他の方法があれば、それもまったくクールです。

お手伝いありがとう!

4

2 に答える 2

0

出力画像は明らかに壊れています。通常、致命的なエラーが発生したときに発生します。このような場合、ライブラリは警告とエラーをコンソールに出力する必要があります。

警告とエラーを調査してください。彼らはあなたに答えを与えるかもしれません。

経験に基づいて、ROWSPERSTRIP タグに誤った値を指定した可能性があると思います。値は 8 の倍数である必要があります。

于 2013-10-07T15:19:24.473 に答える