Как прочитать сжатый файл DXT1 в приложение C# Forms
Я занимаюсь разработкой приложения C# для Windows Forms, которое позволяет пользователям выбирать изображение (обычный файл jpg / png), которое затем сжимается с помощью библиотеки Unity Crunch.
Сжатие прекрасно работает и создает файлы ".crn".
Когда пользователь снова открывает приложение, я хочу показать сжатые изображения. Но я изо всех сил пытаюсь прочитать сжатые файлы CRN обратно в C# System.Drawing.Image
объект.
Я получил этот код от коллеги о том, как читать crns. Однако пример кода использует объекты Unity Texture2D.
ManagedCrunchObject - это просто оболочка для функций библиотеки crunch. Вызывает функции сжатия / распаковки.
int DDS_HEADER_SIZE = 128;
ManagedCrunchObject myObj = new ManagedCrunchObject();
IntPtr ptr = myObj.decompress(absoluteTexturePath);
//Copy bytes into array
byte[] managedArray = new byte[myObj.get_dds_filesize()];
Marshal.Copy(ptr, managedArray, 0, managedArray.Length);
byte ddsSizeCheck = managedArray[4];
if (ddsSizeCheck != 124)
throw new Exception("Invalid DDS DXTn texture. Unable to read"); //this header byte should be 124 for DDS image files
//Find out width and height of texture
int height = managedArray[13] * 256 + managedArray[12];
int width = managedArray[17] * 256 + managedArray[16];
//Removes the header information
//Only used to store file info of image
byte[] dxtBytes = new byte[managedArray.Length - DDS_HEADER_SIZE];
Buffer.BlockCopy(managedArray, DDS_HEADER_SIZE, dxtBytes, 0, managedArray.Length - DDS_HEADER_SIZE);
//Generates a blank texture in Unity
Texture2D texture = new Texture2D(width, height, textureFormat, false);
//Loads a texture using array of bytes
texture.LoadRawTextureData(dxtBytes);
texture.Apply();
myObj.delete();
Я не могу получить изображение как изображение C#. Я пытался создать MemoryStream
от dxtBytes
а затем использовать Image.FromStream
, но я получаю исключение, жалуясь на недопустимое изображение. Я также пытался использовать библиотеку Pfim с Dds.Create
непосредственно в файле, но кажется, что файл не распознается как файл.dds (даже если он кажется внутренним). Я не нашел способ использовать Pfim с dxtBytes
массив.
Если невозможно сгенерировать объект Image, было бы достаточно просто отобразить или нарисовать изображение внутри моей формы Windows.