public void SaveAsJpeg(Stream stream, int width, int height)
RenderTarget2D.SaveAsJpeg()缺少一個參數來設置Jpeg質量,並且輸出有大量工件。 (增加圖像的大小有一點幫助,但它仍然看起來很糟糕)你如何設置RenderTarget2D.SaveAsJpeg()的質量?
該參數隱藏在XNA的某處嗎?我怎樣才能提高jpeg的質量?
public void SaveAsJpeg(Stream stream, int width, int height)
RenderTarget2D.SaveAsJpeg()缺少一個參數來設置Jpeg質量,並且輸出有大量工件。 (增加圖像的大小有一點幫助,但它仍然看起來很糟糕)你如何設置RenderTarget2D.SaveAsJpeg()的質量?
該參數隱藏在XNA的某處嗎?我怎樣才能提高jpeg的質量?
XNA 4.0 API中沒有用於編碼JPEG圖像的質量參數。
作爲一種非常全面的做事方式,您可以創建一個Silverlight WriteableBitmap
,將數據從您的渲染目標中複製出來,然後使用Extensions.SaveJpeg
以自定義質量級別進行保存。
一個更好的選擇可能是簡單地保存一個PNG圖像。
我會同意安德魯羅素,一個更好的選擇將是簡單地保存到PNG,但如果你只是要保存到JPG,那麼有一個更好的方法比去WriteableBitmap。
你可以做的是創建一個空的位圖對象,並通過紋理數據轉移,所以你會做一個Texture2D到位圖轉換。從下面簡單複製:
public static Bitmap ToBitmap(this Microsoft.Xna.Framework.Graphics.Texture2D rd, int Width, int Height)
{
var Bmp = new Bitmap(Width, Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
byte[] data = ToBytes(rd);
var bmpData = Bmp.LockBits(new Rectangle(0, 0, rd.Width, rd.Height), System.Drawing.Imaging.ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
System.Runtime.InteropServices.Marshal.Copy(data, 0, bmpData.Scan0, data.Length);
Bmp.UnlockBits(bmpData);
return Bmp;
}
public static byte[] ToBytes(this Microsoft.Xna.Framework.Graphics.Texture2D rd)
{
byte[] data = new byte[4 * rd.Height * rd.Width];
rd.GetData<byte>(data);
SwapBytes(data);
return data;
}
private static void SwapBytes(byte[] data)
{
System.Threading.Tasks.ParallelOptions po = new System.Threading.Tasks.ParallelOptions();
po.MaxDegreeOfParallelism = -1;
System.Threading.Tasks.Parallel.For(0, data.Length/4, po, t =>
{
int bi = t * 4;
byte temp = data[bi];
data[bi] = data[bi + 2];
data[bi + 2] = temp;
});
}
請注意,上述是非常有效的,但有一定的缺點。與上面類似的代碼可以用於非常快速地實現位圖到Texture2D轉換,但不用預乘alpha。