libtiff.net writeScanLine returns false

本文关键字:false returns writeScanLine net libtiff | 更新日期: 2023-09-27 18:31:57

我正在使用 libtiff.net 从jpeg制作tiff。当我尝试编写时,问题出现了,因为tiff.writeScanLine返回false,这意味着图像没有写在tiff中。

为什么会这样?我怎么能找出问题所在?

代码如下:

 private bool creatingTiff()
        {
            using (Bitmap bmp = new Bitmap(targetFile))
            {
                using (Tiff tif = Tiff.Open("BitmapTo24BitColorTiff.tif", "w"))
                {
                    byte[] raster = getImageRasterBytes(bmp, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
                    tif.SetField(TiffTag.IMAGEWIDTH, bmp.Width);
                    tif.SetField(TiffTag.IMAGELENGTH, bmp.Height);
                    tif.SetField(TiffTag.COMPRESSION, Compression.OJPEG);
                    tif.SetField(TiffTag.PHOTOMETRIC, Photometric.YCBCR);
                    tif.SetField(TiffTag.SUBFILETYPE, 0);
                    tif.SetField(TiffTag.ROWSPERSTRIP, bmp.Height);
                    tif.SetField(TiffTag.ORIENTATION, BitMiracle.LibTiff.Classic.Orientation.TOPLEFT);
                    tif.SetField(TiffTag.XRESOLUTION, bmp.HorizontalResolution);
                    tif.SetField(TiffTag.YRESOLUTION, bmp.VerticalResolution);
                    tif.SetField(TiffTag.RESOLUTIONUNIT, ResUnit.INCH);
                    tif.SetField(TiffTag.BITSPERSAMPLE, 8);
                    tif.SetField(TiffTag.SAMPLESPERPIXEL, 3);
                    tif.SetField(TiffTag.JPEGIFOFFSET, 768);
                    tif.SetField(TiffTag.PLANARCONFIG, PlanarConfig.CONTIG);
                    for (int i = 0, offset = 0; i < bmp.Height; i++)
                    {
                        bool b = tif.WriteScanline(raster, offset, i, 0);
                        Console.WriteLine("write succes: " + b);
                        offset += stride;
                    }
                }
                System.Diagnostics.Process.Start("BitmapTo24BitColorTiff.tif");
                return true;
            }
        }
            
        private static byte[] getImageRasterBytes(Bitmap bmp, System.Drawing.Imaging.PixelFormat format)
        {
            System.Drawing.Rectangle rect = new System.Drawing.Rectangle(0, 0, bmp.Width, bmp.Height);
            byte[] bits = null;
            try
            {
                // Lock the managed memory
                BitmapData bmpdata = bmp.LockBits(rect, ImageLockMode.ReadWrite, format);
                // Declare an array to hold the bytes of the bitmap.
                bits = new byte[bmpdata.Stride * bmpdata.Height];
                // Copy the values into the array.
                System.Runtime.InteropServices.Marshal.Copy(bmpdata.Scan0, bits, 0, bits.Length);
                // Release managed memory
                bmp.UnlockBits(bmpdata);
            }
            catch
            {
                return null;
            }
            return bits;
        }
                                                               
        private static void convertSamples(byte[] data, int width, int height)
        {
            int stride = data.Length / height;
            const int samplesPerPixel = 3;
            for (int y = 0; y < height; y++)
            {
                int offset = stride * y;
                int strideEnd = offset + width * samplesPerPixel;
                for (int i = offset; i < strideEnd; i += samplesPerPixel)
                {
                    byte temp = data[i + 2];
                    data[i + 2] = data[i];
                    data[i] = temp;
                }
            }
        }

tif标签被写入,但图像本身不是。也许如果有人能指出我库开发人员博客(BitMiracle)的方向,我可以直接将我的问题直接提交给他们。

libtiff.net writeScanLine returns false

我认为您的代码有以下错误:

  • 不能将Compression.OJPEG用于新映像。旧的 JPEG 只能解压缩。

  • 您可能不应该手动指定TiffTag.JPEGIFOFFSET值。库将指定适当的值本身。

  • 您正在尝试使用WriteScanline方法编写整个条带。您应该改用WriteEncodedStrip

它还有助于查看库发出的警告(它会将它们发送到控制台)。