Снимок экрана, сделанный с целью C ++, глючит - PullRequest
0 голосов
/ 26 июня 2018

Я посмотрел следующий пост: Получить пиксель с экрана (скриншот) в Max OSX

и реализовал принятый ответ так:

Имя файла: screenshot.mm

#import <Foundation/Foundation.h>

#include <iostream>
#include <cstdint>
#include <cstdio>
#include <fstream>

void    captureScreen(void)
{
        CGImageRef image_ref = CGDisplayCreateImage(CGMainDisplayID());
        CGDataProviderRef provider = CGImageGetDataProvider(image_ref);
        CFDataRef dataref = CGDataProviderCopyData(provider);
        size_t width, height;
        width = CGImageGetWidth(image_ref);
        height = CGImageGetHeight(image_ref);
        size_t bpp = CGImageGetBitsPerPixel(image_ref) / 8;

        std::cout << bpp << " " << width << " " << height << std::endl;

        uint8 *pixels = (uint8*)malloc(width * height * bpp);
        memcpy(pixels, CFDataGetBytePtr(dataref), width * height * bpp);
        CFRelease(dataref);
        CGImageRelease(image_ref);

        std::ofstream file("image.ppm");

        file << "P6 " << width << " " << height << " " << "256" << "\n";

        for (size_t i = 0; i < height; i++)
        {
                for (size_t j = 0; j < width; j++)
                {
                        file << pixels[(j + j * i) * bpp + 0]
                                << pixels[(j + j * i) * bpp + 1]
                                << pixels[(j + j * i) * bpp + 2];
                }
                file << std::endl;
        }
}

int     main(void)
{
        NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

        captureScreen();

        [pool drain];
        return 0;
}

скомпилировано с: clang++ -framework Foundation -framework CoreGraphics screenshot.mm

, но при просмотре скриншота это выглядит так:

bugged screenshot

примечание: это только часть изображения, поскольку размер файла был слишком велик, но вы поняли

Как правильно получить скриншот?

...