我正在开发一个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 library和Dds.Create
,但是似乎该文件未被识别为.dds文件(即使它似乎是一个内部文件)。我找不到将Pfim与dxtBytes
数组一起使用的方法。
如果无法生成Image对象,那么只需在Windows窗体内显示或绘制图像就足够了。