当传入数据来自JPEG图像时,T​​iffBitmapEncoder不保持透明度

时间:2018-01-05 20:58:55

标签: c# image bitmap tiff

这对我来说很奇怪。我有一个过程(遗留代码),它接受一个位图并以适当的格式导出结果。我正在尝试导出TIFF文件(长话短说,我们需要无损格式,与RLE编码相比,PNG花费的时间几乎翻了一倍)。我知道TIFF确实具有透明性,如果 Target Bitmap最初来自PNG或BMP文件,无论我将其导出为TIFF还是PNG,该软件的确有效。但是,如果文件是JPG,将其导出为PNG会保持透明度,但将其导出为TIFF则不会。我在这里错过了什么?如果我运行 Target.Save(“Target.png”) Target.Save(“Target.tiff”,ImageFormat.tiff),我也会得到相同的结果

public static void Save(Bitmap Target, Stream Destination, string Extension, int Quality, bool UsePadding)
{
    BitmapEncoder encoder;
    string sMetadataType = string.Empty;

    switch (Extension.ToLower())
    {
        case ".bmp":
            BmpBitmapEncoder bmp = new BmpBitmapEncoder();
            encoder = bmp;
            sMetadataType = "bmp";
            break;
        case ".jpg":
        case ".jpe":
        case ".jpeg":
            JpegBitmapEncoder jpg = new JpegBitmapEncoder();
            jpg.QualityLevel = Quality;
            encoder = jpg;
            sMetadataType = "jpg";
            break;

        case ".png":
            PngBitmapEncoder png = new PngBitmapEncoder();
            encoder = png; 
            sMetadataType = "png";
            break;

        case ".tif":
        case ".tiff":
            TiffBitmapEncoder tiff = new TiffBitmapEncoder();
            tiff.Compression = TiffCompressOption.Rle;
            encoder = tiff;
            sMetadataType = "tiff";
            break;

        default:
            throw new Exception("Invalid image extension");
    }

    Rectangle rc = new Rectangle(0, 0, Target.Width, Target.Height);
    BitmapData bmpData = Target.LockBits(rc, ImageLockMode.ReadWrite, System.Drawing.Imaging.PixelFormat.Format32bppArgb);

    try
    {
        int nSize = bmpData.Stride * Target.Height;

        BitmapSource src = BitmapFrame.Create(Target.Width, Target.Height, 
                                              Target.HorizontalResolution, Target.VerticalResolution, 
                                              System.Windows.Media.PixelFormats.Bgra32, null, 
                                              bmpData.Scan0, nSize, bmpData.Stride);

        BitmapMetadata meta = null;

        if (UsePadding && (encoder is JpegBitmapEncoder))
        {
            uint paddingAmount = 2048;
            meta = new BitmapMetadata(sMetadataType);
            meta.SetQuery("/app1/ifd/PaddingSchema:Padding", paddingAmount);
            meta.SetQuery("/app1/ifd/exif/PaddingSchema:Padding", paddingAmount);
            meta.SetQuery("/xmp/PaddingSchema:Padding", paddingAmount);
        }

        encoder.Frames.Add(BitmapFrame.Create(src, null, meta, null));
        encoder.Save(Destination);
    }
    finally
    {
        Target.UnlockBits(bmpData);
    }
}

我怀疑这可能与调色板有关。 JPEG有24位。 TIFF有32个。我记得在几个月前使用WebP格式时遇到类似的东西。

在其他奇怪的情况下,我通过使用TiffBitmapDecoder将图像拉回我的应用程序并使用IrfanView来测试这种透明度的损失。我把图像拉进GIMP,然后看,透明度就存在了。这让我想知道问题是否部分是编码器(使用一些奇怪的方法来编码透明度,而不是由Windows中的编解码器或在IrfanView中拾取)和部分解码器(因为无法读取所述不寻常的透明度)。

0 个答案:

没有答案