2

我想从 Metro Apps 中的像素字节数组创建位图。较早的以下功能用于相同的用途:

//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;

但现在 Windows 8 中不存在 BitmapData 类。请建议任何替代方式。

谢谢,潘卡伊

4

2 回答 2

1

如果我没有完全记错的话,上面的部分代码取自Evil DICOM库,来自ImageHelper.GetBitmap方法。

我自己尝试将此代码移植到Metro(或任何微软最终将调用的代码),这是 Metro 类似物ImageHelper.GetBitmap在我的移植中的样子:

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 的答案,但如果你还没有“在那里”,希望这个答案可以引导你更直接地实现你的目标。

更新

我现在已经在 Github 上发布了我的 Evil Dicom 端口到 Metro。你可以在这里找到存储库这里也是一个非常简单的 Metro 应用程序的显示,我在其中使用了这个 Evil Dicom Metro 端口:

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 回答