标签: lockbits

C#LockBits性能(int [,]到byte [])

Graphics g;
using (var bmp = new Bitmap(_frame, _height, PixelFormat.Format24bppRgb))
{
    var data = bmp.LockBits(new Rectangle(0, 0, _frame, _height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
    var bmpWidth = data.Stride;
    var bytes = bmpWidth * _height;
    var rgb = new byte[bytes];
    var ptr = data.Scan0;
    Marshal.Copy(ptr, rgb, 0, bytes);

    for (var i = 0; i < _frame; i++)
    {
        var i3 = (i << 1) + i;
        for (var j = 0; j < _height; j++)
        {
            var ij = j * bmpWidth + i3; …
Run Code Online (Sandbox Code Playgroud)

c# performance picturebox lockbits

3
推荐指数
1
解决办法
3038
查看次数

使用C#中的锁定位写入映像

我正在努力优化我正在研究的程序,该程序当前使用锁定位读取字节数据,但使用setPixel写入像素数据.那么我如何实际修改我正在阅读的像素数据呢?如果我尝试设置pp,cp或np,该方法将无法工作(因为它循环并需要pp,cp和np来表示像素数据),所以我完全感到困惑.我是否需要将像素数据写入byte []并对其进行操作,或者是什么?

这是一个代码示例:

BitmapData data = img.LockBits(new Rectangle(0, 0, img.Width, img.Height),
    ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);

int scaledPercent = (int)(Math.Round(percentageInt * 255)) - 47;
Debug.WriteLine("percent " + scaledPercent);
unsafe
{
    Debug.WriteLine("Woah there, unsafe stuff");
    byte* prevLine = (byte*)data.Scan0;
    byte* currLine = prevLine + data.Stride;
    byte* nextLine = currLine + data.Stride;

    for (int y = 1; y < img.Height - 1; y++)
    {
        byte* pp = prevLine + 3;
        byte* cp = currLine + 3;
        byte* np = nextLine + 3;
        for (int x …
Run Code Online (Sandbox Code Playgroud)

c# image pixel image-processing lockbits

3
推荐指数
1
解决办法
4552
查看次数

为什么Bitmap.LockBits在VM上失败

在部署之前,我使用XP VM和Vista VM对我的应用程序进行烟雾测试.这两款VM都使用32位色.不确定它是否有任何区别,但我正在使用VirtualBox.每台机器还分配2GB内存,2个处理器.XP有128MB的视频RAM,Vista 256(在每种情况下我可以设置它们的最大值).运行机器的桌面有6个内核和16GB内存.同样,不确定这些信息是否相关但谁知道.

以下是我使用的扩展方法,以便将一个Bitmap像素转换为可以直接使用的像素.因为,毕竟我们需要速度.速度是我们所需要的.油腻,速度快!和Bitmap.GetPixel是相反的.

public static ArgbColor[] GetPixels(this Bitmap bitmap)
{
  ArgbColor[] results;
  int width;
  int height;
  BitmapData bitmapData;

  width = bitmap.Width;
  height = bitmap.Height;
  results = new ArgbColor[width * height];
  bitmapData = bitmap.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);

  unsafe
  {
    ArgbColor* pixelPtr;

    pixelPtr = (ArgbColor*)(void*)bitmapData.Scan0;

    for (int row = 0; row < height; row++)
    {
      for (int col = 0; col < width; col++)
      {
        results[row * width + col] = *pixelPtr;

        pixelPtr++;
      }
    } …
Run Code Online (Sandbox Code Playgroud)

c# graphics gdi+ bitmap lockbits

2
推荐指数
1
解决办法
933
查看次数

C# 如何将 get GetPixel / SetPixel 颜色处理转换为 Lockbits?

编辑:我非常感谢您的回复。这里我最需要的是示例代码,用于说明我如何处理嵌套循环中的几行代码,因为这是在 GetPixel/SetPixel 中可以正常工作的,但也是我无法使用 Lockbits 正常工作的。谢谢

我正在尝试将图像处理过滤器从 GetPixel / SetPixel 转换为 Lockbits,以缩短处理时间。 我也在 Stack Overflow、MSDN 和其他网站上看到过 Lockbits 教程,但我做错了。 我从一个非常简单的滤镜开始,它只是减少绿色以创建红色和紫色效果。这是我的代码:

   private void redsAndPurplesToolStripMenuItem_Click(object sender, EventArgs e)
    {
        // Get bitmap from picturebox
        Bitmap bmpMain = (Bitmap)pictureBoxMain.Image.Clone();

        // search through each pixel via x, y coordinates, examine and make changes. Dont let values exceed 255 or fall under 0.  
        for (int y = 0; y < bmpMain.Height; y++)
            for (int x = 0; x < bmpMain.Width; x++)
            {
                bmpMain.GetPixel(x, y);
                Color c = …
Run Code Online (Sandbox Code Playgroud)

c# image-processing lockbits getpixel argb

2
推荐指数
1
解决办法
5605
查看次数

使用BitmapData和C#中的指针进行快速位图修改

我正从一些相机(RAW数据阵列)捕获数据.

然后我根据调色板将这些数据映射到RGB值.

我需要尽可能快地映射它,所以我使用BitmapDdata指针在不安全的代码片段中使用和编辑像素.

public void dataAcquired(int[] data)
{
    Bitmap bmp = new Bitmap(width, height); 
    BitmapData data = bmp.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);

    for (int i = 0; i < data.Length; i++)
    {
        int x = i % bmp.Width;
        int y = i / bmp.Width;
        Rgb rgb = mapColors[data[i]];

        unsafe
        {
            byte* ptr = (byte*)data.Scan0;
            ptr[(x * 3) + y * data.Stride] = rgb.b;
            ptr[(x * 3) + y * data.Stride + 1] = rgb.g;
            ptr[(x * …
Run Code Online (Sandbox Code Playgroud)

c# performance lockbits bitmapdata

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