次のように、PNG画像のデータを非表示にしようとしています:
// Creates a new empty image with the pre-defined palette
BitmapSource image = BitmapSource.Create(
width,
height,
96,
96,
PixelFormats.Bgr24,
myPalette,
imageData,
stride);
PngBitmapEncoder encoder = new PngBitmapEncoder();
encoder.Interlace = PngInterlaceOption.On;
BitmapFrame frame = BitmapFrame.Create(image);
encoder.Frames.Add(frame);
//estimate PNG file size using the amount of data being saved
MemoryStream arrayStream = new MemoryStream(imageData.Length);
encoder.Save(arrayStream);
imageData は、PNG 画像に隠しているデータです。これをデコードする方法は次のとおりです。
Stream encodedImageStream = new MemoryStream(imageData, 0, imageDataSize);
PngBitmapDecoder decoder = new PngBitmapDecoder(encodedImageStream, BitmapCreateOptions.None, BitmapCacheOption.Default);
BitmapFrame bitmapSource = decoder.Frames[0];
//align on the rhs boundary
int stride = ((bitmapSource.PixelWidth + 1) * bytesPerPixel) & ~3;
byte[] pixels = new byte[bitmapSource.PixelHeight * stride];
bitmapSource.CopyPixels(pixels, stride, 0);
問題は、エンコーダーが画像の PixelFormat を Bgr24 から Bgr32 に変更しているように見えることです。エンコード前にすべてのピクセル値が 0 に設定された画像をデコードした後、ピクセル値が [0,0,0,255,0] の画像が得られます。 ,0,0,255,...] これは、エンコーダーが画像に透明度を追加したことを示唆しています。フォーマットを同じに保ちたいので、助けてください