首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

GDI+中的MakeARGB有关问题

2012-05-03 
GDI+中的MakeARGB问题以下是程序,我想将RGB转换成YCbCr,然后显示一个分量的图片,但是结果为什么会在图片上

GDI+中的MakeARGB问题
以下是程序,我想将RGB转换成YCbCr,然后显示一个分量的图片,但是结果为什么会在图片上出现垂直方向的栅格呢?如果增加i自增的量,栅格就会变大,但是图片就不是想要的结果了,求教高人指教!

C/C++ code
#include <Windows.h>#include <GdiPlus.h>using namespace Gdiplus;void eyeMap(HDC hdc){    Graphics graphic(hdc);    Bitmap bmp(L"test.bmp");    int width = bmp.GetWidth();    int height = bmp.GetHeight();    Rect rect(0,0,width,height);    BitmapData data;    bmp.LockBits(&rect,ImageLockModeRead | ImageLockModeWrite,bmp.GetPixelFormat(),&data);    int stride = data.Stride;    UINT *pixel = (UINT *)data.Scan0;    BYTE r,g,b;    BYTE Y,Cb,Cr;            for(int j = 0; j < height; j++)    {        for(int i = 0; i < width;i++)        {                 r = pixel[j*(stride)/4+i] & 0x00ff0000;            g = pixel[j*(stride)/4+i] & 0x0000ff00;            b = pixel[j*(stride)/4+i] & 0x000000ff;                                                r = r / 0x10000;            g = g / 0x100;                             Y = 0.299*r + 0.587*g + 0.114*b;            Cb = -0.1687*r - 0.3313*g + 0.5*b + 128;            Cr = 0.5*r - 0.4187*g - 0.0813*b + 128;                        ARGB ss = Color::MakeARGB(0,Cb,Cb,Cb);            Color color(ss);                                    pixel[j*stride/4+i] = ss;                    }        }        bmp.UnlockBits(&data);        graphic.DrawImage(&bmp,0,0);}




[解决办法]
改后代码:
C/C++ code
void CTED::eyeMap( HDC hdc ){    Graphics graphic( hdc );    Bitmap bmp( L"iphone1.bmp" ); //改动0        int width  = bmp.GetWidth( );    int height = bmp.GetHeight( );        Rect rect( 0, 0, width, height );    BitmapData data;    bmp.LockBits( &rect, ImageLockModeRead | ImageLockModeWrite, PixelFormat32bppARGB, &data ); //改动1 PixelFormat24bppRGB        int stride = data.Stride;    UINT *pixel = ( UINT* )data.Scan0;    BYTE r,  g,  b;    BYTE Y, Cb, Cr;        for( int row = 0; row < height; ++ row )  //改动2    {        for( int col = 0; col < width; ++ col )        {            r = pixel[ row * ( stride ) / 4 + col ] & 0x00ff0000;            g = pixel[ row * ( stride ) / 4 + col ] & 0x0000ff00;            b = pixel[ row * ( stride ) / 4 + col ] & 0x000000ff;                        r = r / 0x10000;            g = g / 0x100;                        Y  =  0.2990 * r + 0.5870 * g + 0.1140 * b;            Cb = -0.1687 * r - 0.3313 * g + 0.5000 * b + 128;            Cr =  0.5000 * r - 0.4187 * g - 0.0813 * b + 128;                        ARGB ss = Color::MakeARGB( 255, Cb, Cb, Cb ); //改动3                        Color color( ss );                        pixel[ row * stride / 4 + col ] = ss;        }    }        bmp.UnlockBits( &data );        graphic.DrawImage( &bmp, 0, 0 );} 

热点排行