5

スクリーン バッファからピクセルを読み取ろうとしCGImageRefていますCGDisplayCreateImage。画像の幅は 1366 です。CGImageGetWidthCGImageGetBytesPerRow

何が起きてる?画像に何らかのパディングがありますか?安全に取得しているデータから、正しい結果を得るにはどうすればよいですか?

編集:これを再現するために必要な最小限のコードは次のとおりです。

#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;
}
4

1 に答える 1

18

行あたりのバイト (「ストライド」とも呼ばれます) は、イメージの幅よりも大きくなる場合があります。各行の末尾にある余分なバイトは単純に無視されます。(x, y)オフセットの開始位置にあるピクセルのバイトy * bpr + x * bpp(bprは行あたりのbppバイト数、 はピクセルあたりのバイト数)。

1376 は 32 (およびそれより小さい 2 の累乗) で割り切れますが、1366 は割り切れないことに注意してください。最新の Mac の CPU には、一度に 16、32、または 64 バイトで動作する命令があるためCGImage、画像のストライドが 16、32、または 64 の倍数である場合、アルゴリズムはより効率的になります CGDisplayCreateImage

于 2014-09-07T02:26:12.520 に答える