2

メトロアプリのピクセルのバイト配列からビットマップを作成したい。以下の関数は同じために使用されました:

//Here create the Bitmap to the know height, width and format
  Bitmap bmp = new Bitmap( 352, 288, PixelFormat.Format24bppRgb);  

  //Create a BitmapData and Lock all pixels to be written 
  BitmapData bmpData = bmp.LockBits(
                       new Rectangle(0, 0, bmp.Width, bmp.Height),   
                       ImageLockMode.WriteOnly, bmp.PixelFormat);

  //Copy the data from the byte array into BitmapData.Scan0
  Marshal.Copy(data, 0, bmpData.Scan0, data.Length);


  //Unlock the pixels
  bmp.UnlockBits(bmpData);


  //Return the bitmap 
  return bmp;

しかし、BitmapDataクラスは現在Windows8には存在しません。同じための別の方法を提案してください。

ありがとう、パンカイ

4

2 に答える 2

1

私が完全に間違っていない場合、上記のコードの一部は、メソッドのEvilDICOMライブラリから取得されます。ImageHelper.GetBitmap

私は自分でこのコードをMetro(またはMicrosoftが最終的に呼び出す予定のコード)に移植しようとしました。これImageHelper.GetBitmapが私の移植でのMetroアナログの外観です。

public static BitmapSource GetBitmap(float[] pixels, ImageProperties properties)
{
    var bmp = new WriteableBitmap(properties.Rows, properties.Columns);

    using (var stream = bmp.PixelBuffer.AsStream())
    {
        var bytes = new byte[4 * pixels.Length];
        for (int i = 0; i < pixels.Length; i++)
        {
            var greyness = properties.WindowAndLevel.GetValue(pixels[i]);
            bytes[4 * i] = greyness;
            bytes[4 * i + 1] = greyness;
            bytes[4 * i + 2] = greyness;
            bytes[4 * i + 3] = 0xff;
        }

        stream.Write(bytes, 0, bytes.Length);
    }

    return bmp;
}

(実際、私はstream.WriteAsync自分のコードで使用しており、メソッドをとして宣言する必要がありますasync。ただし、これは上記の質問自体には関係ありません。)

この答えはDiogoの答えに似ていますが、まだ「そこに」いない場合は、この答えがより直接的に目標につながることを願っています。

アップデート

これで、EvilDicomポートをGithubのMetroに公開しました。リポジトリはここにあります。また、このEvilDicomMetroポートを使用した非常に単純なMetroアプリケーションからの表示もあります。

メトロDICOMビューア

于 2012-08-08T10:24:45.710 に答える
0

WritableBitmapクラスを使用してみてください。

そのようなものが機能するはずです:

WriteableBitmap newBmp = new WriteableBitmap(width, height);
Stream stream = newBmp.PixelBuffer.AsStream();

stream.Seek(0, 0);
stream.Write(bytes, 0, bytes.Length);
newBmp.Invalidate();

これを機能させるには、おそらく次の名前空間を使用する必要があります。

using System.Runtime.InteropServices.WindowsRuntime;
using Windows.Graphics.Imaging;
using Windows.Storage.Streams;
于 2012-07-27T14:11:12.850 に答える