我搜索了关于字节数组的所有问题,但我总是失败.我从未编写过c#我是这方面的新手.你能帮我解决一下如何从字节数组制作图像文件.
这是我的函数,它将字节存储在名为的数组中 imageData
public void imageReady( byte[] imageData, int fWidth, int fHeight))
Run Code Online (Sandbox Code Playgroud) 我目前遇到以下问题:我想转换来自具有以下配置的文件的字节数组:
Byte1: R color of pixel 0,0.
Byte2: G color of pixel 0,0.
Byte3: B color of pixel 0,0.
Byte4: R color of pixel 0,1.
...
ByteN: R color of pixel n,n.
Run Code Online (Sandbox Code Playgroud)
所以我想做的是将这些字节转换为位图,而不必逐像素设置,bitmap.setPixel因为它需要太长时间.
有什么建议?提前致谢!
从解锁的Bitmap非托管内存直接写入和读取是否可以?
在我解锁Bitmap后,我可以继续使用BitmapData吗?我做了一个测试应用程序,我可以在鼠标位置读取PictureBox的Bitmap像素,而另一个线程正在将像素写入同一个Bitmap.
编辑1:正如Boing他在回答中指出的那样:"Scan0没有指向Bitmap对象的实际像素数据;而是指向一个临时缓冲区,它代表Bitmap对象中像素数据的一部分." 来自MSDN.
但是一旦我得到了Scan0,我就可以读取/写入Bitmap而无需Lockbits或UnlockBits!我在一个帖子里做了很多次.相对于MSDN,它不应该发生,因为Scan0指向位图数据的COPY!好吧,在C#中,所有测试表明它不是副本.在C++中,我不知道它是否正常工作.
编辑2:使用旋转方法有时会使操作系统释放位图像素数据副本.结论,it is not safe to read/write an unlocked Bitmap Scan0.谢谢Boing的回答和评论!
下面是我如何获取BitmapData并读取和写入像素值.
/// <summary>
/// Locks and unlocks the Bitmap to get the BitmapData.
/// </summary>
/// <param name="bmp">Bitmap</param>
/// <returns>BitmapData</returns>
public static BitmapData GetBitmapData(Bitmap bmp)
{
BitmapData bmpData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadOnly, bmp.PixelFormat);
bmp.UnlockBits(bmpData);
return bmpData;
}
/// <summary>
/// Get pixel directly from unamanged pixel data based on the Scan0 pointer.
/// </summary> …Run Code Online (Sandbox Code Playgroud) 我有一个来自相机的ByteArray,它只是一个流而且没有位图头.
我搜索了一个演示,但它们都是用C++编写的.
我尝试在我的代码中添加一个bitmapheader,但抛出了一个ParameterException.如何从ByteArray创建位图文件?
我确信这个答案将取决于用户机器,但必须有一些关于固定数据的最佳实践。
我需要保存 5 个字节数组,每个数组包含 1.048.576 个字节。通常我更喜欢使用GCHandle(托管)内存,但有些人说它会减慢 GC。我知道这可能发生,但是需要固定多少内存/对象才能开始真正影响 GC?
以下是我拥有的选项:
GCHandle.Alloc GCHandleType.Pinned(管理)。它会减慢GC??Marshal.AllocHGlobal(非托管访问)。不安全代码Bitmap在 Scan0 中保存数据(非托管访问)。不安全代码