2011-02-25 158 views

回答

11

这里是做的非常快,虽然不安全,道:

[编辑]这个例子了0.035毫秒

// Create 2D array of integers 
int width = 320; 
int height = 240; 
int stride = width * 4; 
int[,] integers = new int[width,height]; 

// Fill array with random values 
Random random = new Random(); 
for (int x = 0; x < width; ++x) 
{ 
    for (int y = 0; y < height; ++y) 
    { 
     byte[] bgra = new byte[] { (byte)random.Next(255), (byte)random.Next(255), (byte)random.Next(255), 255 }; 
     integers[x, y] = BitConverter.ToInt32(bgra, 0); 
    } 
} 

// Copy into bitmap 
Bitmap bitmap; 
unsafe 
{ 
    fixed (int* intPtr = &integers[0,0]) 
    { 
     bitmap = new Bitmap(width, height, stride, PixelFormat.Format32bppRgb, new IntPtr(intPtr)); 
    } 
} 

和结果:

result

+0

很好的例子,但图像看起来不是随机:) – Pedery 2011-02-25 06:57:50

+0

:)你是对的,我也看到它...因为C#“随机”类是基于一个明确的数学算法,我猜它不应该是全部那令人惊讶。 – tbridge 2011-02-25 07:38:35

+0

很好的例子,但是这显示了一个1维数组,而不是2-D。 – Kohanz 2014-04-25 16:11:39

0

如果有需要速度看my Kinect sample。基本上它创建一个内存区域,并使用一个不安全的指针向内存生成一个Int32数组。 BitmapSource对象用于将位图(图像)直接映射到同一区域。这个特殊的例子也使用非托管内存使其与P/Invoke兼容。

This blogpost描述了使用不安全的性能差异。从 部分看看:

注意,您可以一样好做的Int32 [] - 指针,而不是它使用的例子字节[] - 指针。

0

如果速度是不是一个问题 - 位图+ SetPixel比保存到一个文件:​​

+0

简单,但正如你所说:慢。令人惊讶的慢! :) – 2011-02-25 05:37:32

0

Bitmap.LockBits应该工作,如果你想要一个WinForms图像。

+0

@ozcanovunc:语法已经很完美了。你可能想阅读关于现在的进行时态。 – 2016-05-19 15:10:45

0

将数组投影到base64字符串中以便流入Bitmap也会变慢吗?

相关问题