2011-02-10 41 views
0
public void SaveAsJpeg(Stream stream, int width, int height) 

RenderTarget2D.SaveAsJpeg()缺少一個參數來設置Jpeg質量,並且輸出有大量工件。 (增加圖像的大小有一點幫助,但它仍然看起來很糟糕)你如何設置RenderTarget2D.SaveAsJpeg()的質量?

該參數隱藏在XNA的某處嗎?我怎樣才能提高jpeg的質量?

回答

2

XNA 4.0 API中沒有用於編碼JPEG圖像的質量參數。

作爲一種非常全面的做事方式,您可以創建一個Silverlight WriteableBitmap,將數據從您的渲染目標中複製出來,然後使用Extensions.SaveJpeg以自定義質量級別進行保存。

一個更好的選擇可能是簡單地保存一個PNG圖像。

0

我會同意安德魯羅素,一個更好的選擇將是簡單地保存到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。