这对我来说很奇怪。我有一个过程(遗留代码),它接受一个位图并以适当的格式导出结果。我正在尝试导出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中拾取)和部分解码器(因为无法读取所述不寻常的透明度)。