Сохранение 8-битных индексированных данных в PNG изменяет исходные байты при использовании BitmapSource, PngBitmapEncoder / Decoder

У меня проблема при сохранении и загрузке PNG с использованием BitmapSource и PngBitmapEncoder / Decoder. По сути, я хотел бы иметь возможность сохранить изображение, которое было создано в виде массива байтов, и когда PNG загружен в мою программу, перезагрузите точно такие же байты. Сохранение оригинальных данных важно.

В то же время мне бы хотелось, чтобы PNG использовал собственную палитру (индексированный массив из 256 цветов).

Я пытаюсь сохранить свои 8-битные данные с помощью пользовательской индексированной палитры. Исходные данные могут варьироваться от 0 до 255. Палитра может быть «пороговой» палитра (например, 0-20 - это цвет # 1, 21-50 - это цвет # 2 и т. д.).

Что я обнаружил, так это то, что когда я сохраняю данные, перезагружаюсь и делаю CopyPixels, чтобы получить & quot; raw & quot; данные, значения данных устанавливаются на основе палитры, а не исходных значений байтового массива.

Есть ли способ сохранить исходный байтовый массив в PNG,without потерять пользовательскую палитру? Или есть другой способ получить массив байтов из 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 записями. Это также, кажется, зависит от установленной палитры. Есть идеи почему?

Ответы на вопрос(1)

Ваш ответ на вопрос