Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将System::Drawing::Image^转换为无符号字符_C++_.net_Winforms_Clr_Picturebox - Fatal编程技术网

C++ 如何将System::Drawing::Image^转换为无符号字符

C++ 如何将System::Drawing::Image^转换为无符号字符,c++,.net,winforms,clr,picturebox,C++,.net,Winforms,Clr,Picturebox,我需要在winforms中将Image^转换为无符号字符以实现debayering函数。 代码: void convert bayer8tobgr(VmbUchar_t*bayerImgDat,VmbUchar_t*bgrOutputDat) { VmbUchar_t*newimagedata_start=bgrOutputDat; int currentTempIndex=0; int nearestBluesAvg=0; int nearestRedsAvg=0; int最接近绿色平均值=0

我需要在winforms中将Image^转换为无符号字符以实现debayering函数。
代码:

void convert bayer8tobgr(VmbUchar_t*bayerImgDat,VmbUchar_t*bgrOutputDat)
{
VmbUchar_t*newimagedata_start=bgrOutputDat;
int currentTempIndex=0;
int nearestBluesAvg=0;
int nearestRedsAvg=0;
int最接近绿色平均值=0;
对于(int j=0;j<1100;j++)
{
对于(inti=0;i<2752;i++)//GR。。。
{
如果(currentTempIndex%2==0/*偶数,绿色*/)
{
//平均蓝
if(j==0)//如果在第一行,只取下一个蓝色
{
最近的Bluesavg=*(bayerImgDat+currentTempIndex+2752);
}
其他的
{
最接近的bluesavg=(*(bayerImgDat+currentTempIndex+2752)+*(bayerImgDat+currentTempIndex-2752))/2;
}
*bgrOutputDat=nearestBluesAvg;//b
bgrOutputDat++;
*bgrOutputDat=*(bayerImgDat+currentTempIndex);//g
bgrOutputDat++;
//平均红
if(i==0)//如果在第一列中,只取下一个红色
{
nearestRedsAvg=*(bayerImgDat+currentTempIndex+1);
}
其他的
{
nearestRedsAvg=(*(bayerImgDat+currentTempIndex+1))+(*(bayerImgDat+currentTempIndex-1))/2;
}
*bgrOutputDat=nearestRedsAvg;//r
bgrOutputDat++;
currentTempIndex++;
}
else/*奇数,红色*/
{
//平均蓝
if(i==1099)//若在最后一列中,只取左下角的蓝色像素
{
最接近的Bluesavg=*(bayerImgDat+currentTempIndex-1+2752);
}
else//else左下和右下
{
最接近的bluesavg=(*(bayerImgDat+currentTempIndex+1+2752)+*(bayerImgDat+currentTempIndex-1+2752))/2;
}
*bgrOutputDat=nearestBluesAvg;//b
bgrOutputDat++;
//平均绿色
最接近的GreensAVG=(*(bayerImgDat+currentTempIndex-1)+*(bayerImgDat+currentTempIndex+2752))/2;
*bgrOutputDat=nearestGreensAvg;//g
bgrOutputDat++;
*bgrOutputDat=*(bayerImgDat+currentTempIndex);//r
bgrOutputDat++;
currentTempIndex++;
}
}
对于(int i=0;i<2752;i++)//B G B。。。。
{
如果(currentTempIndex%2==0/*偶数,蓝色*/)
{
*bgrOutputDat=*(bayerImgDat+currentTempIndex);//b
bgrOutputDat++;
//平均绿色
最接近的GreensAVG=(*(bayerImgDat+currentTempIndex+1)+*(bayerImgDat+currentTempIndex-2752))/2;
*bgrOutputDat=nearestGreensAvg;//g
bgrOutputDat++;
//平均红
if(i==0)//如果是第一列,则只取右上像素
{
nearestRedsAvg=*(拜里姆格达+currentTempIndex+1-2752);
}
else//else同时获取左上和右上像素
{
nearestRedsAvg=(*(拜里姆格达+当前临时索引-1-2752)+*(拜里姆格达+当前临时索引+1-2752))/2;
}
*bgrOutputDat=nearestRedsAvg;//r
bgrOutputDat++;
currentTempIndex++;
}
else/*奇数,绿色*/
{
//平均蓝
if(i==2751)//如果在最后一列中,只取上一个蓝色(下一个蓝色不存在)
{
最近的Bluesavg=*(bayerImgDat+currentTempIndex-1);
}
else//else取下一个和上一个
{
最接近的bluesavg=(*(bayerImgDat+currentTempIndex+1)+*(bayerImgDat+currentTempIndex-1))/2;
}
*bgrOutputDat=nearestBluesAvg;//b
bgrOutputDat++;
*bgrOutputDat=*(bayerImgDat+currentTempIndex);//g
bgrOutputDat++;
//平均红
if(j==1099)//如果在最后一行,只取前一个红色(下一个红色不存在)
{
nearestRedsAvg=*(拜里姆格达+currentTempIndex-2752);
}
否则//else两者都要
{
nearestRedsAvg=(*(bayerImgDat+currentTempIndex+2752)+*(bayerImgDat+currentTempIndex-2752))/2;
}
*bgrOutputDat=nearestRedsAvg;//r
bgrOutputDat++;
currentTempIndex++;
}
}
}
bgrOutputDat=newimagedata\u启动;
}

有人能帮我把Image^转换成unsigned char,或者重写这个函数以使用Image^作为输入吗

谢谢,
nREW

您需要访问位图中的像素数据。对
图像
执行此操作的最佳方法是在
位图
子类上使用
锁位
方法。类似这样的内容(假设您的
图像
实际上是一个
位图
):

auto bmp=dynamic\u cast(图像);
矩形矩形矩形(0,0,bmp->宽度,bmp->高度);
自动bmpData=bm->LockBits(rect,系统::绘图::成像::图像锁定模式::只读);
VmbUchar_t*bayerImgDat=reinterpret_cast(bmpData->Scan0.ToPointer());
VmbUchar_t*bgrOutputDat=//需要分配
转换Bayer8Tobgr(bayerImgDat,bgrOutputDat);

您需要访问位图中的像素数据。对
图像
执行此操作的最佳方法是在
位图
子类上使用
锁位
方法。类似这样的内容(假设您的
图像
实际上是一个
位图
):

auto bmp=dynamic\u cast(图像);
矩形矩形矩形(0,0,bmp->宽度,bmp->高度);
自动bmpData=bm->LockBits(rect,系统::绘图::成像::图像锁定模式::只读);
VmbUchar_t*bayerImgDat=reinterpret_cast(bmpData->Scan0.ToPointer());
VmbUchar_t*bgrOutputDat=//需要分配
转换Bayer8Tobgr(bayerImgDat,bgrOutputDat);
void ConvertBayer8ToBGR(VmbUchar_t* bayerImgDat, VmbUchar_t* bgrOutputDat)
{
VmbUchar_t* newimagedata_start = bgrOutputDat;

int currentTempIndex = 0;
int nearestBluesAvg = 0;
int nearestRedsAvg = 0;
int nearestGreensAvg = 0;

for(int j = 0; j < 1100; j++)
{
    for(int i = 0; i < 2752; i++) //G R G R G... 
    {
        if(currentTempIndex % 2 == 0 /* even, green */)
        {
            //avg blue
            if(j == 0) //if in the first row, only take next blue
            {
                nearestBluesAvg = *(bayerImgDat+currentTempIndex+2752);
            }
            else
            {
                nearestBluesAvg = (*(bayerImgDat + currentTempIndex + 2752) + *(bayerImgDat+currentTempIndex-2752)) / 2;
            }
            *bgrOutputDat = nearestBluesAvg; //b
            bgrOutputDat++;
            *bgrOutputDat = *(bayerImgDat + currentTempIndex); //g
            bgrOutputDat++;
            //avg red
            if(i == 0) //if in first column, only take next red 
            {
                nearestRedsAvg = *(bayerImgDat+currentTempIndex+1);
            }
            else
            {
                nearestRedsAvg = ( (*(bayerImgDat+currentTempIndex+1)) + (*(bayerImgDat+currentTempIndex-1)) ) / 2;
            }
            *bgrOutputDat = nearestRedsAvg; //r
            bgrOutputDat++;

            currentTempIndex++;
        }
        else /* odd, red*/
        {
            //avg blue
            if(i == 1099) //if in last column, take just left-down blue pixel
            {
                nearestBluesAvg = *(bayerImgDat+currentTempIndex-1+2752);
            }
            else // else take both left-down and right-down
            {
                nearestBluesAvg = (*(bayerImgDat+currentTempIndex+1+2752) + *(bayerImgDat+currentTempIndex-1+2752)) / 2;
            }
            *bgrOutputDat = nearestBluesAvg; //b
            bgrOutputDat++;
            //avg green
            nearestGreensAvg = (*(bayerImgDat+currentTempIndex-1) + *(bayerImgDat+currentTempIndex+2752)) / 2;
            *bgrOutputDat = nearestGreensAvg;  //g
            bgrOutputDat++;
            *bgrOutputDat = *(bayerImgDat + currentTempIndex); //r
            bgrOutputDat++;

            currentTempIndex++;
        }
    }
    for(int i = 0; i < 2752; i++)//B G B G B G B....
    {
        if(currentTempIndex % 2 == 0 /* even, blue */)
        {

            *bgrOutputDat = *(bayerImgDat + currentTempIndex); //b
            bgrOutputDat++;
            //avg green
            nearestGreensAvg = (*(bayerImgDat + currentTempIndex + 1) + *(bayerImgDat + currentTempIndex -2752)) / 2;
            *bgrOutputDat = nearestGreensAvg; //g
            bgrOutputDat++;
            //avg red
            if(i == 0) //if first column, take only right-up pixel
            {
                nearestRedsAvg = *(bayerImgDat+currentTempIndex+1-2752);
            }
            else //else take both left-up and right-up pixels
            {
                nearestRedsAvg = (*(bayerImgDat+currentTempIndex-1-2752) + *(bayerImgDat+currentTempIndex+1-2752)) / 2;
            }
            *bgrOutputDat = nearestRedsAvg; //r
            bgrOutputDat++;

            currentTempIndex++;

        }
        else /* odd, green*/
        {
            //avg blue
            if(i == 2751) //if in last column, only take previous blue (next blue doesnt exist)
            {
                nearestBluesAvg = *(bayerImgDat + currentTempIndex - 1);
            }
            else //else take both next and previous
            {
                nearestBluesAvg = (*(bayerImgDat+currentTempIndex+1) + *(bayerImgDat+currentTempIndex-1)) / 2;
            }
            *bgrOutputDat = nearestBluesAvg; //b
            bgrOutputDat++;
            *bgrOutputDat = *(bayerImgDat + currentTempIndex); //g
            bgrOutputDat++;
            //avg red
            if(j == 1099) //if in last row, only take previous red (next red doesn't exist)
            {
                nearestRedsAvg = *(bayerImgDat+currentTempIndex-2752);
            }
            else //else take both
            {
                nearestRedsAvg = (*(bayerImgDat+currentTempIndex+2752) + *(bayerImgDat+currentTempIndex-2752)) / 2;
            }
            *bgrOutputDat = nearestRedsAvg; //r
            bgrOutputDat++;

            currentTempIndex++;
        }
    }
}


bgrOutputDat = newimagedata_start;
auto bmp = dynamic_cast<Bitmap^>(image);
Rectangle rect(0, 0, bmp->Width, bmp->Height);
auto bmpData = bm->LockBits(rect, System::Drawing::Imaging::ImageLockMode::ReadOnly);
VmbUchar_t* bayerImgDat = reinterpret_cast<VmbUchar_t*>(bmpData->Scan0.ToPointer());
VmbUchar_t* bgrOutputDat = // need to allocate
ConvertBayer8ToBGR(bayerImgDat, bgrOutputDat);