如何使用图像的像素数据将图像旋转90度?

3

目前我正在使用glReadPixels()捕获屏幕。捕获的图像通常是镜像图像,因此我将图像翻转回正常状态。 现在我想将捕获的数据(图像)旋转90度。 有什么想法吗?

我用于捕获屏幕数据的代码是:

CGRect screenBounds = [[UIScreen mainScreen] bounds];

int backingWidth = screenBounds.size.width;
int backingHeight =screenBounds.size.height;

glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth);
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight);


NSInteger myDataLength = backingWidth * backingHeight * 4;
GLuint *buffer;
if((buffer= (GLuint *) malloc(myDataLength)) == NULL )
    NSLog(@"error initializing the buffer");
glReadPixels(0, 0, backingWidth, backingHeight, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
// code for flipping back (mirroring the image data)    
for(int y = 0; y < backingHeight / 2; y++) {
    for(int xt = 0; xt < backingWidth; xt++) {
        GLuint top = buffer[y * backingWidth + xt];
        GLuint bottom = buffer[(backingHeight - 1 - y) * backingWidth + xt];
        buffer[(backingHeight - 1 - y) * backingWidth + xt] = top;
        buffer[y * backingWidth + xt] = bottom;
    }
}

您好,您有没有想过如何将缓冲区中捕获的数据旋转90度? 谢谢。

2个回答

2
size_t at (size_t x, size_t y, size_t width)
{
    return y*width + x;
}

void rotate_90_degrees_clockwise (
    const pixel * in,
    size_t in_width,
    size_t in_height,
    pixel * out)
{
    for (size_t x = 0; x < in_width; ++x) {
        for (size_t y = 0; y < in_height; ++i)
            out [at (in_height-y, in_width-x, in_height)]
               = in [at (x, y, in_width)];
    }
}

有时,纸笔记录是无可替代的 :-)
如果你维护x_in和y_in与x_out和y_out之间的关系——递增一个并递减另一个——并在循环之间缓存x,则可以优化此过程,但这是基本思路。

嘿,我尝试了这段代码,但它没有正确地工作。获得的图像是扭曲的。另外,我正在制作这些帧的视频,在每个循环中分配另一个缓冲区会导致性能问题。此外,我对这个特定代码出现异常。 - Tornado
现在我正在使用同一缓冲区,异常已被移除。现在仅剩下图像扭曲的问题。嘿,我不太确定如何检查你的代码是否为3 * 5整数数组...因为我的图像数据存储在GLuint类型的缓冲区中,我认为它代表了一个平坦的数组..我是OpenGL方面的新手。 - Tornado
在我的代码片段中,pixel 可以是任何类型。创建一个静态整数数组 {{1,2,3,4,5},{10,20,30,40,50},...} 并在转换之前和之后打印它们。错误应该立即显而易见。 - spraff
我使用静态数组进行了检查,但是使用你的代码片段得到了错误的输出... - Tornado
非常抱歉给您带来了这么多麻烦...我已经完全理解了您的代码,现在正在获取那些上下颠倒的值,我想我需要将数据翻转回来。在代码中进行了编辑“out [at (in_height-y-1, in_width-x-1, in_height)] = in [at (x, y, in_width)];”,没有这个编辑,我会得到一些垃圾值。我会在明天继续努力。感谢您的帮助。此致敬礼。 - Tornado
显示剩余5条评论

2

我终于弄清楚了整个过程。对于想要做相同操作的其他人,以下是通过像素数据旋转图像90度、180度、270度所需的代码:

// Rotate 90
// height and width specifies corresponding height and width of image            
for (int h = 0, dest_col = height - 1; h < height; ++h, --dest_col)
{
    for (int w = 0; w < width; w++)
    {
        dest[(w * height) + dest_col] = source[h*width + w];
    }
}

// Rotate 180
for (int h=0, dest_row=(height-1); h < height; --dest_row, ++h)
{
    for (int w=0, dest_col=(width-1); w < width; ++w, --dest_col)
    {
        dest[dest_row * width + dest_col] = source[h*width + w];
    }
}

// Rotate 270
for (int h = 0, dest_col=0; h < height; ++dest_col, ++h)
{
    for (int w=0, dest_row=width-1; w < width; --dest_row, ++w)
    {
        dest[(dest_row * height) + dest_col] = source[h * width + w];
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接