Как прочитать сжатый файл 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.

0 ответов

Другие вопросы по тегам