BayerBG8转RBG图像并放入PictureBox

colinodowd

会员
已加入
2020年1月23日
留言内容
12
编程经验
1-3
捕获.png


将BagerBG8字节数组转换为RGB,然后将RGB图像填充到pictureBox时,我遇到很多麻烦。我相信下面的代码可以解决向RGB的转换,但是我无法使新的字节数组适合pictureBox。

C#:
int src_width = 3840;
int src_height = 2748;

int dst_width = src_width / 2;
int dst_height = src_height / 2;
int col = 0;
int a = 0;
byte[] destination = new byte[dst_width * dst_height * 3];
int pos = 0;

for (int row = 0; row <= dst_width; row += 2)
{
    for (col = 0; col < dst_height; col += 2)
    {
        a = row * src_width + col;
        //blue from this line
        destination[pos++] = buffer[a];

        //green average of two greens from this line and next line:
        destination[pos++] = (byte) ((buffer[a + 1] + buffer[a + dst_width]) / 2);

        //red from the next line
        destination[pos++] = buffer[a + dst_width + 1];
    }
}

Bitmap bitmap = bitmap = new Bitmap(1920, 1374, PixelFormat.Format24bppRgb);
BitmapData bmData = bitmap.LockBits(new System.Drawing.Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadWrite, bitmap.PixelFormat);
IntPtr pNative = bmData.Scan0;
Marshal.Copy(test, 0, pNative, test.Length);
bitmap.UnlockBits(bmData);
pictureBox1.Image = bitmap;
pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;

这导致仅1/3的pictureBox被填充。有人知道我在做什么错吗?
 
由主持人最后编辑:

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,508
地点
弗吉尼亚州切萨皮克
编程经验
10+
现在,这是交叉发布的一个有趣的变体...在两个不同的论坛上发布相同的问题,但是提供了两个完全的代码库。对于接下来的人,我们的OP似乎在 堆栈溢出.
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,926
地点
英国
编程经验
10+
您好,欢迎到论坛。

这意味着您在两个完全不同的代码库的两个不同的论坛上发布了相同的问题。那就是他要去的地方。为什么从堆栈溢出中删除问题?

这是否意味着您已经解决了问题?
 
Last edited:

colinodowd

会员
已加入
2020年1月23日
留言内容
12
编程经验
1-3
@谢平 完全不同的是拉伸,我使用了稍微不同的方法来查找拜耳图像的R,G,B像素,但其他所有内容都是相同的。此外,这些帖子提出了不同的问题。我删除了SO问题,因为我解决了这个问题。我现在仍然坚持将RGB图像填充到pictureBox中,如上图所示。
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,508
地点
弗吉尼亚州切萨皮克
编程经验
10+
Line 30 is copying some array test[/code] as bitmap data, but your loops on lines 8-25 is populating an array named [icode]destination. Since you don't show us how the test array is created and populated, we don't really know why only a third of the bitmap is filled.
 

colinodowd

会员
已加入
2020年1月23日
留言内容
12
编程经验
1-3
@跳伞 我从Basler SDK获取测试阵列。


C#:
IGrabResult grabResult = camera.StreamGrabber.RetrieveResult(5000, TimeoutHandling.ThrowException);
using (grabResult)

{
    // Image grabbed successfully?
    if (grabResult.GrabSucceeded)

    {
        test = grabResult.PixelData as byte[];
        ImageWindow.DisplayImage(0, grabResult);
        image_filepath += file_extension;
        ImagePersistence.Save(ImageFileFormat.Png, image_filepath, grabResult);
    }
    else
    {
        Console.WriteLine("Error: {0} {1}", grabResult.ErrorCode, grabResult.ErrorDescription);
    }
}



int src_width = 3840;
int src_height = 2748;

int dst_width = src_width / 2;
int dst_height = src_height / 2;

int col = 0;
int a = 0;
byte[] destination = new byte[dst_width * dst_height * 3];
int pos = 0;

for (int row = 0; row <= dst_width; row += 2)
{
    for (col = 0; col < dst_height; col += 2)
    {
        a = row * src_width + col;
        //blue from this line
        destination[pos++] = test[a];
        //green average of two greens from this line and next line:
        destination[pos++] = (byte) ((test[a + 1] + test[a + dst_width]) / 2);
        //red from the next line
        destination[pos++] = test[a + dst_width + 1];
    }
}



Bitmap bitmap = bitmap = new Bitmap(1920, 1374, PixelFormat.Format24bppRgb);
BitmapData bmData = bitmap.LockBits(new System.Drawing.Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadWrite, bitmap.PixelFormat);
IntPtr pNative = bmData.Scan0;
Marshal.Copy(destination, 0, pNative, destination.Length);
bitmap.UnlockBits(bmData);
pictureBox1.Image = bitmap;
pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
 
Last edited:

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,508
地点
弗吉尼亚州切萨皮克
编程经验
10+
I've never used the Basket SDK. I find it really strange that you can get a reference to an array in the IGrabResult (line 9), and then dispose that IGrabResult (end of using scope at line 18), but still be able to use the array in your nested for loops (lines 39-43). So much for the SDK following the .NET Framework's design guidelines regarding "least surprise".

无论如何,使用此新代码,您得到的结果是不同的,还是相同的?如果您注释掉第2行会怎样?
 
最佳 底部