Как прочитать сжатый файл DXT1 в приложение C # Forms - PullRequest
0 голосов
/ 03 января 2019

Я разрабатываю приложение 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...