我正在尝试将位图图像顺时针旋转90度。 我已经尝试将信息头的高度和高度改为宽度,所以当它循环时它将循环高度,然后宽度但不旋转,所以我想我需要将它们放入X和Y坐标中字节数组部分。我已经被困了3天了,所以如果可能的话,请帮助我!非常感谢。请指导我完成这些代码,再次感谢您!
hfile = CreateFile(ofn.lpstrFile, GENERIC_READ, FILE_SHARE_READ, (LPSECURITY_ATTRIBUTES)NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, (HANDLE) NULL );
ReadFile(hfile, &bfh, sizeof(bfh), &written, NULL);
ReadFile(hfile, &bih, sizeof(bih), &written, NULL);
bmi.bmiHeader = bih;
int imagesize = bih.biHeight * bih.biWidth * 3; // Allocate necessary data for image
image = new BYTE[imagesize];
image1 = new BYTE[imagesize];
ReadFile(hfile, image, imagesize, &written, NULL);
SetDIBitsToDevice(hdc, 0, 0, bih.biWidth, bih.biHeight, 0, 0, 0,
bih.biHeight, image,&bmi,DIB_RGB_COLORS);
width = bih.biHeight;
height = bih.biWidth;
for(int x=0; x<height; x++)
{
for(int y=0; y<width; y++)
{
image1[(y*height+x)*3+0] = image[(y*height-1-x)*3+0];
image1[(y*height+x)*3+1] = image[(y*height-1-x)*3+1];
image1[(y*height+x)*3+2] = image[(y*height-1-x)*3+2];
}
}
SetDIBitsToDevice(hdc,height,0,width,height,0,0,0,bih.biHeight,image1,&bmi,DIB_RGB_COLORS);
width = bih.biHeight;
height = bih.biWidth;
ReleaseDC(hwnd, hdc);
return 0;
EndPaint(hWnd, &ps);
return 0;
答案 0 :(得分:0)
如果我们可以将其分解为具有数据缓冲区的类,并且能够从这样的矩阵“获取”并“设置”矩阵索引(x,y)处的颜色,那么您的工作将更容易
因此我们可以拥有最简单的
setPixel( int x, int y, BYTE red, BYTE green, BYTE blue );
和
getPixel( int x, int y, BYTE& red, BYTE& green, BYTE& blue ) const;
当然我们可以把RGB放到一个“结构”中。
然后你可以
image2.setPixel( height-y-1, x, image1.getPixel( x, y, red, green blue ) );
在你的循环中,只要你的类设置正确就应该旋转。
答案 1 :(得分:0)
我明白了。
添加了point1和point2坐标,它们接收图像字节数组并返回x和y。
从那里我发现了,
使用for循环,切换高度和宽度
image1[point2(height-1-y,x)+0] = image[point1(x,y)+0];
无论如何,谢谢!