2012-03-17 11 views
1

それが適切に 動作しないので、私は XNAのGIFアニメーションライブラリ を編集しています、それはgifファイルをロードしますが、間違った色でXNAのGIFアニメーション

その輸入コード

public override GifAnimationContent Import(string filename, ContentImporterContext context) 
    { 
     GifAnimationContent content = new GifAnimationContent(); 
     Image source = Image.FromFile(filename); 
     FrameDimension dimension = new FrameDimension(source.FrameDimensionsList[0]); 
     int frameCount = source.GetFrameCount(dimension); 
     content.Frames = new TextureData[frameCount]; 
     for (int i = 0; i < frameCount; i++) 
     { 
      source.SelectActiveFrame(dimension, i); 
      byte[] buffer = Quantizer.Quantize(source); 
      content.Frames[i].__1__SurfaceFormat = SurfaceFormat.Color; 
      content.Frames[i].__2__Width = source.Width; 
      content.Frames[i].__3__Height = source.Height; 
      content.Frames[i].__4__Levels = 1; 
      content.Frames[i].Data = buffer; 
     } 
     source.Dispose(); 
     return content; 
    } 

私はと思います問題はSurfaceFormat.Colorです。Gifファイルは他のものをサポートしていないため、 インデックス付きパレット以外は ですが、正しく動作するようにGIFイメージ上でどのようなファイル変換が行われるべきか、どのSurfaceformatが正しいか把握できません。

助けてください

ありがとうございます。

+0

のsurfaceFormat Enumerationを読み取る場合: msdn.microsoft.com/en-us/library/microsoft.xna.framework.graphics.surfaceformat(v=xnagamestudio.40).aspx – MySqlError

答えて

1

これは約100万年遅れていることは知っていますが、私のように、いつでもこの問題に遭遇しています。ここでいくつかの研究の後に修正しました。

量子化のソースを開いて量子化を見て、ポインタのものからバイト配列にバイトを割り当てるセクションを開くと、1番目と3番目のバイト(赤と青の値)、それはそれを修正する必要があります。

私がここにいるので、私はMarshal.Copyを使用して量子化を大幅に高速化した別のことを共有して、ポインタからバイト配列にコピーします。これを行うことに欠点があるか、これが望ましくない状況があるかどうかはわかりません。そうでないと誰かが知っていれば、私はそれを聞きたくなります。

だからこのソリューションは素晴らしい作品とあなたは私のようなリアルタイムでそれを使用しようとしている場合に重要である元のコードよりも高速である

 BitmapData bitmapdata = image.LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); 
     byte* numPtr = (byte*)bitmapdata.Scan0.ToPointer(); 
     int index = 0; 
     byte[] buffer = new byte[(source.Width * source.Height) * 4]; 
     for(int i = 0; i < source.Width; i++) { 
      for(int j = 0; j < source.Height; j++) { 
       buffer[index] = numPtr[index]; 
       index++; 
       buffer[index] = numPtr[index]; 
       index++; 
       buffer[index] = numPtr[index]; 
       index++; 
       buffer[index] = numPtr[index]; 
       index++; 
      } 
     } 
     image.UnlockBits(bitmapdata); 
     return buffer; 

 BitmapData bitmapdata = copy.LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); 
     byte[] bytes = new byte[source.Width * source.Height * 4]; 

     //copy the bytes from the Scan0 pointer to our byte array 
     Marshal.Copy(bitmapdata.Scan0, bytes, 0, bytes.Length); 

     //swap the red and blue bytes 
     for(int a = 0; a < bytes.Length; a += 4) { 
      byte tmp = bytes[a]; 
      bytes[a] = bytes[a + 2]; 
      bytes[a + 2] = tmp; 
     } 

     copy.UnlockBits(bitmapdata); 

     return bytes; 

に変更ありました。それをさらに高速化するために、イメージが別のビットマップに書き換えられた箇所を削除しました。なぜ、それがなぜ始まったのか分からず、必要ではないと私は間違っていました。

また、赤と青のバイトをスワップする方法があるかどうかわかりません。これを行うには、より良い方法があるかどうか聞いてみたいと思います。誰もが今までにこのとにかく...

+0

場合は、このライブラリはオープンソースです。問題を解決するには、これらの変更を含むプルリクエストを開くことを強くお勧めします。 – Qix

+0

xna gifアニメーションライブラリは、5年間でほとんど更新されていませんが、これらの変更が標準バージョンでは重要ではないと私は確信しています。私は[この](http://xboxforums.create.msdn.com/forums/t/57297.aspx)を使用している間、この問題を抱えているだけです。 私はこの色の切り替えの問題がなぜ問題であるのか、なぜMODを作った人がこの問題に気付かずに修正したのか理解できません。 – Bolt

+0

XNAをまだ使用しているのはなぜですか? xD – MySqlError

関連する問題