Convert TIFF to 1bit

后端 未结 1 1401
暗喜
暗喜 2021-01-28 10:08

I wrote a desktop app which converts an 8bit TIFF to a 1bit but the output file cannot be opened in Photoshop (or other graphics software). What the application does is

相关标签:
1条回答
  • 2021-01-28 10:10

    From your description of the byte manipulation part, it appears you are converting the image data from 8-bit to 1-bit correctly. If that's the case, and you don't have specific reasons to do it from scratch using your own code, you can simplify the task of creating valid TIFF files by using System.Drawing.Bitmap and System.Drawing.Imaging.ImageCodecInfo. This allows you to save either uncompressed 1-bit TIFF or compressed files with different types of compression. The code is as follows:

    // first convert from byte[] to pointer
    IntPtr pData = Marshal.AllocHGlobal(imgData.Length);
    Marshal.Copy(imgData, 0, pData, imgData.Length);
    int bytesPerLine = (imgWidth + 31) / 32 * 4; //stride must be a multiple of 4. Make sure the byte array already has enough padding for each scan line if needed
    System.Drawing.Bitmap img = new Bitmap(imgWidth, imgHeight, bytesPerLine, PixelFormat.Format1bppIndexed, pData);
    
    ImageCodecInfo TiffCodec = null;
    foreach (ImageCodecInfo codec in ImageCodecInfo.GetImageEncoders())
       if (codec.MimeType == "image/tiff")
       {
          TiffCodec = codec;
          break;
       }
    EncoderParameters parameters = new EncoderParameters(2);
    parameters.Param[0] = new EncoderParameter(Encoder.Compression, (long)EncoderValue.CompressionLZW);
    parameters.Param[1] = new EncoderParameter(Encoder.ColorDepth, (long)1);
    img.Save("OnebitLzw.tif", TiffCodec, parameters);
    
    parameters.Param[0] = new EncoderParameter(Encoder.Compression, (long)EncoderValue.CompressionCCITT4);
    img.Save("OnebitFaxGroup4.tif", TiffCodec, parameters);
    
    parameters.Param[0] = new EncoderParameter(Encoder.Compression, (long)EncoderValue.CompressionNone);
    img.Save("OnebitUncompressed.tif", TiffCodec, parameters);
    
    img.Dispose();
    Marshal.FreeHGlobal(pData); //important to not get memory leaks
    
    0 讨论(0)
提交回复
热议问题