从位图图像读取字节数组到坐标X和Y?

时间:2012-01-17 17:19:13

标签: c++ image bitmap coordinates rotation

我正在尝试将位图图像顺时针旋转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;

2 个答案:

答案 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];

无论如何,谢谢!