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