2014-09-07 8 views
4

Я пытаюсь прочитать пиксели из буфера экрана, я создаю CGImageRef с CGDisplayCreateImage, но значения для CGImageGetWidth и CGImageGetBytesPerRow Не имеет смысла вместе , деление байтов на строку на байты на пиксель дает мне 1376 пикселей на строку, но ширина изображения составляет 1366.CGImageRef ширина не согласен с байт за строкой

Что здесь происходит? Есть ли какие-то дополнения в изображении? Как я читаю данные, которые я получаю из него безопасно, и с правильными результатами?

Edit: минимальный код, необходимый для воспроизведения этого заключается в следующем:

#import <Foundation/Foundation.h> 
#import <ApplicationServices/ApplicationServices.h> 

int main(int argc, const char * argv[]) 
{ 

    @autoreleasepool { 
     CGImageRef image = CGDisplayCreateImage(CGMainDisplayID()); 

     size_t width = CGImageGetWidth(image); 
     size_t bpr = CGImageGetBytesPerRow(image); 
     size_t bpp = CGImageGetBitsPerPixel(image); 
     size_t bpc = CGImageGetBitsPerComponent(image); 
     size_t bytes_per_pixel = bpp/bpc; 

     NSLog(@"%li %li", bpr/bytes_per_pixel, width); 

     CGImageRelease(image); 

    } 
    return 0; 
} 
+0

Я просто получаю изображение из буфера дисплея. – porglezomp

+0

Какими должны быть размеры изображения? –

+0

Действительно, единственное, что имеет значение здесь, это то, что ширина данных отличается от ширины содержимого. Я не должен получать 1376 для количества пикселей в строке и иметь ширину изображения 1366. – porglezomp

ответ

10

байт в строку (также называемые «шагом») может быть больше, чем ширина изображения. Дополнительные байты в конце каждой строки просто игнорируются. Байты для пикселя на (x, y) начинаются со смещения y * bpr + x * bpp (где bpr - это байты на строку, а bpp - байты на пиксель).

Обратите внимание, что 1376 точно делится на 32 (и все меньшие мощности 2), а 1366 - нет. Процессоры в современных Mac имеют инструкции, которые работают на 16 или 32 или 64 байта за раз, поэтому алгоритмы CGImage могут быть более эффективными, если шаг изображения кратен 16 или 32 или 64. CGDisplayCreateImage был написан кем-то, кто знает это ,

+0

Спасибо, это именно то, что мне нужно, объяснение того, почему это так, тоже очень приветствуется. – porglezomp

+0

Как обычно. У Роба есть потрясающие ответы. – uchuugaka