libtiff.net writeScanLine返回false

时间:2014-11-26 07:08:12

标签: c# libtiff.net

我正在使用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)的方向,我可以直接将他的问题告诉他们。

1 个答案:

答案 0 :(得分:0)

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

  • 您无法将Compression.OJPEG用于新图片。旧JPEG只能解压缩。

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

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

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