![](/img/trans.png)
[英]Getting OutOfMemoryException when I load a tga file of 1 mb in c#
[英]How to load PNGs and export to TGA keeping alpha in C#?
我正在編寫一個工具來自動化我們為游戲制作的一些資產。 我想要做的是獲取PNG文件的文件夾,將它們組合成紋理圖集,然后將圖集導出為TGA,將UV坐標導出為XML。
我不確定我應該使用哪種方法在C#中加載PNG文件,因為似乎有幾種。 在C#中加載圖像的推薦方法是什么,可以訪問顏色/ alpha數據,以便將其提取到TGA?
我也已經在C ++中創建了TGA創建代碼,我打算轉到C#,但我想知道.Net中是否有任何可用於創建/保存TGA的東西?
謝謝閱讀。
將PNG文件加載到.Net位圖很容易:
Bitmap bmp = (Bitmap)Bitmap.FromFile("c:\wherever\whatever.png");
// yes, the (Bitmap) cast is necessary. Don't ask me why.
加載Bitmap后,您可以使用Bitmap的LockBits方法最有效地訪問其所有信息(包括Alpha通道信息)(StackOverflow上有許多LockBits代碼示例)。
更新 :這是一個代碼示例,演示如何使用LockBits逐個像素地訪問位圖的數據:
System.Drawing.Imaging.BitmapData data =
bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height),
System.Drawing.Imaging.ImageLockMode.ReadOnly, bmp.PixelFormat);
unsafe
{
// important to use the BitmapData object's Width and Height
// properties instead of the Bitmap's.
for (int x = 0; x < data.Width; x++)
{
int columnOffset = x * 4;
for (int y = 0; y < data.Height; y++)
{
byte* row = (byte*)data.Scan0 + (y * data.Stride);
byte B = row[columnOffset];
byte G = row[columnOffset + 1];
byte R = row[columnOffset + 2];
byte alpha = row[columnOffset + 3];
}
}
}
bmp.UnlockBits(data);
您需要為項目設置“允許不安全代碼”編譯器選項才能使用此代碼。 您也可以使用Bitmap的GetPixel(x,y)方法,但這非常慢。
我沒有代碼示例,但我可以為您提供指導
你想用調色板嗎? 從你制作游戲開始,我建議你為你的位圖計算一個調色板,然后把它放到targa中以減小文件大小。
哦,在我忘記之前,.NET不使用RGBA,相反,像素是BGRA。 不要問我為什么,但就像那樣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.