Как повернуть изображение на 90 градусов, используя пиксельные данные изображения? - PullRequest
2 голосов
/ 19 июля 2011

В настоящее время я снимаю экран с помощью 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 голосов
/ 22 июля 2011

К, наконец, я все понял.Для тех, кто хочет сделать то же самое, вот коды для поворота изображения из данных пикселей на 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];
             }
             }
2 голосов
/ 19 июля 2011
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 между циклами, но это основная идея.

...