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