Я разрабатываю приложение C # для Windows Forms, которое позволяет пользователям выбирать изображение (обычный файл jpg / png), которое затем сжимается с помощью библиотеки Unity Crunch .
сжатияотлично работает, и он будет создавать файлы ".crn".
Когда пользователь снова откроет приложение, я хочу показать сжатые изображения.Но я изо всех сил пытаюсь прочитать сжатые файлы crn обратно в объект C # System.Drawing.Image
.
Я получил этот код от коллеги о том, как читать crns.Однако пример кода использует объекты Unity Texture2D.
ManagedCrunchObject - это просто оболочка для функций библиотеки хруста.Он вызывает функции сжатия / распаковки.
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.