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

RenderTarget2D.SaveAsJpeg()にはJpeg品質を設定するパラメータがありません。出力には多くのアーチファクトがあります。 (画像のサイズを大きくすると少しは助けになりますが、まだ悪いです)RenderTarget2D.SaveAsJpeg()の品質をどのように設定しますか?

このパラメータはXNAのどこかに隠されていますか?どのように私はJPEGの品質を向上させることができますか?

答えて

2

JPEGイメージをエンコードするためのXNA 4.0 APIには、品質パラメータはありません。

Silverlight WriteableBitmapを作成し、レンダーターゲットからそのデータをコピーしてから、Extensions.SaveJpegを使用してカスタム品質レベルで保存することができます。

もっと良い方法は、PNG画像を保存することです。

0

Andrew Russelによると、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; 
     }); 
    } 

上記は非常に効率的ですが、特定の欠点があります。上記と同様のコードを使用すると、Bitmap to Texture2D変換を非常に迅速に達成できますが、アルファを事前に乗算することはありません。

関連する問題