PngBitmapEncoder无法按预期工作

时间:2012-12-02 18:12:35

标签: c# image png

我正在尝试隐藏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,...]这表明编码器为图像添加了透明度,我希望它保持格式相同,请帮忙

1 个答案:

答案 0 :(得分:1)

尝试encoder.Palette = BitmapPalettes.Gray256;