相关疑难解决方法(0)

如何从字节数组创建位图?

我搜索了关于字节数组的所有问题,但我总是失败.我从未编写过c#我是这方面的新手.你能帮我解决一下如何从字节数组制作图像文件.

这是我的函数,它将字节存储在名为的数组中 imageData

public void imageReady( byte[] imageData, int fWidth, int fHeight))
Run Code Online (Sandbox Code Playgroud)

c# image bytearray bitmap

56
推荐指数
4
解决办法
13万
查看次数

字节数组或矩阵到BitMap

我目前遇到以下问题:我想转换来自具有以下配置的文件的字节数组:

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因为它需要太长时间.

有什么建议?提前致谢!

c# arrays byte bitmap

6
推荐指数
1
解决办法
6526
查看次数

直接读取和写入Unlocked Bitmap非托管内存(Scan0)

从解锁的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)

c# bitmap lockbits unmanaged-memory

6
推荐指数
1
解决办法
5630
查看次数

将位图标头添加到字节数组,然后创建位图文件

我有一个来自相机的ByteArray,它只是一个流而且没有位图头.

我搜索了一个演示,但它们都是用C++编写的.

我尝试在我的代码中添加一个bitmapheader,但抛出了一个ParameterException.如何从ByteArray创建位图文件?

c# image bitmap

5
推荐指数
2
解决办法
5862
查看次数

多少 GCHandle 固定内存/对象会使垃圾收集器变慢?

我确信这个答案将取决于用户机器,但必须有一些关于固定数据的最佳实践

我需要保存 5 个字节数组,每个数组包含 1.048.576 个字节。通常我更喜欢使用GCHandle(托管)内存,但有些人说它会减慢 GC。我知道这可能发生,但是需要固定多少内存/对象才能开始真正影响 GC?

以下是我拥有的选项:

  1. GCHandle.Alloc GCHandleType.Pinned(管理)。它会减慢GC??
  2. Marshal.AllocHGlobal(非托管访问)。不安全代码
  3. 使用 aBitmap在 Scan0 中保存数据(非托管访问)。不安全代码

c# garbage-collection unmanaged

5
推荐指数
1
解决办法
1232
查看次数