Durch das Speichern von indizierten 8-Bit-Daten in einem PNG werden die ursprünglichen Bytes bei Verwendung von BitmapSource, PngBitmapEncoder / Decoder geändert

Ich habe ein Problem beim Speichern und Laden eines PNG mit BitmapSource und PngBitmapEncoder / Decoder. Grundsätzlich möchte ich in der Lage sein, ein Bild, das als Array von Bytes entstanden ist, zu speichern, und wenn das PNG in mein Programm geladen wird, genau dieselben Bytes neu zu laden. Die Aufbewahrung der Originaldaten ist wichtig.

Gleichzeitig möchte ich, dass das PNG eine benutzerdefinierte Palette (ein indiziertes Array mit 256 Farben) verwendet.

Ich versuche, meine 8-Bit-Daten mit einer benutzerdefinierten indizierten Palette zu speichern. Die Originaldaten können zwischen 0 und 255 liegen. Die Palette kann eine "Schwellen" -Palette sein (z. B. 0-20 ist Farbe Nr. 1, 21-50 ist Farbe Nr. 2 usw.).

Was ich finde, ist, dass, wenn ich die Daten speichere, neu lade und CopyPixels mache, um die "Roh" -Daten abzurufen, die Datenwerte auf der Grundlage der Palette festgelegt werden, nicht der ursprünglichen Byte-Array-Werte.

Gibt es eine Möglichkeit, das ursprüngliche Byte-Array innerhalb des PNG beizubehalten,ohne die benutzerdefinierte Palette verlieren? Oder gibt es eine andere Möglichkeit, das Byte-Array von der BitmapSource abzurufen?

Das Folgende ist meine Speicherroutine:

      // 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);

Und das ist meine Laderoutine:

    // 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);

Anregungen wäre dankbar. Vielen Dank.

Nachtrag Nr. 1: Ich stelle fest, dass ein Teil des Problems darin besteht, dass das PNG als 32-Bit-Farbe gespeichert wird, obwohl ich es auf Indiziert8 gesetzt und eine 256-Eintrags-Farbpalette verwendet habe. Dies scheint auch von der eingestellten Palette abzuhängen. Irgendeine Idee warum?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage