如何将压缩的DXT1文件读入C#Forms应用程序

时间:2019-01-03 08:45:27

标签: c# winforms image-compression dxt

我正在开发一个C#Windows窗体应用程序,该应用程序允许用户选择图像(常规jpg / png文件),然后使用Unity Crunch library对其进行压缩。

压缩效果很好,它将创建“ .crn”文件。

当用户再次打开应用程序时,我想显示压缩的图像。但是我正在努力将压缩的crn文件读回到C#System.Drawing.Image对象中。

我从同事那里收到了有关如何阅读crn的代码。但是,示例代码使用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 libraryDds.Create,但是似乎该文件未被识别为.dds文件(即使它似乎是一个内部文件)。我找不到将Pfim与dxtBytes数组一起使用的方法。

如果无法生成Image对象,那么只需在Windows窗体内显示或绘制图像就足够了。

0 个答案:

没有答案