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

У меня проблема при сохранении и загрузке PNG с использованием BitmapSource и PngBitmapEncoder / Decoder. В основном яЯ хотел бы иметь возможность сохранить изображение, которое возникло как массив байтов, и когда 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 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)

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