使用 BitmapSource 和 PngBitmapEncoder/Decoder 保存和加载 PNG 时出现问题。基本上,我希望能够保存一个源自字节数组的图像,并且当 PNG 加载到我的程序中时,重新加载完全相同的字节。原始数据的保存很重要。
同时,我希望 PNG 使用自定义调色板(256 色的索引数组)。
我正在尝试使用自定义索引调色板保存我的 8 位数据。原始数据的范围可以是 0-255。调色板可以是“阈值”调色板(例如,0-20 是颜色#1,21-50 是颜色#2,等等)。
我发现当我保存数据、重新加载并执行 CopyPixels 以检索“原始”数据时,数据值是根据调色板设置的,而不是原始字节数组值。
有没有办法在不丢失自定义调色板的情况下保留 PNG 中的原始字节数组?还是有不同的方法从 BitmapSource 检索字节数组?
以下是我的保存例程:
// This gets me a custom palette that is an array of 256 colors
List<System.Windows.Media.Color> colors = PaletteToolsWPF.TranslatePalette(this, false, true);
BitmapPalette myPalette = new BitmapPalette(colors);
// This retrieves my byte data as an array of dimensions _stride * sizeY
byte[] ldata = GetData();
BitmapSource image = BitmapSource.Create(
sizeX,
sizeY,
96,
96,
PixelFormats.Indexed8,
myPalette,
ldata,
_stride);
PngBitmapEncoder enc = new PngBitmapEncoder();
enc.Interlace = PngInterlaceOption.On;
enc.Frames.Add(BitmapFrame.Create(image));
// save the data via FileStream
enc.Save(fs);
这是我的加载程序:
// Create an array to hold the raw data
localData = new byte[_stride * sizeY];
// Load the data via a FileStream
PngBitmapDecoder pd = new PngBitmapDecoder(Fs, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
BitmapSource bitmapSource = pd.Frames[0];
// When I look at the byte data, it is *not* the same as my original data
bitmapSource.CopyPixels(localData, _stride, 0);
任何建议,将不胜感激。谢谢。
附录#1:我发现部分问题在于 PNG 被保存为 32 位颜色,尽管我将它设置为 Indexed8 并使用 256 项调色板。这似乎也取决于设置的调色板。知道为什么吗?