Я пытаюсь получить снимок экрана со всех мониторов, связанных с моим MAC, на одну фотографию. Я знаю, как я могу это сделать, если скриншот каждого монитора будет сохранен на разные снимки, но это не то, что я хочу. Я нашел функцию CGGetDisplaysWithRect, но мое решение не работает, потому что выходное изображение пуст. Я ожидаю, что проблема с функцией CGDisplayCreateImageForRect (* показывает, rect), потому что первый параметр должен быть CGDirectDisplayID, но не CGDirectDisplayID *. Но я не могу найти функцию, которая может создать одно изображение с некоторыми объектами CGDirectDisplayID.
Помогите мне пожалуйста !!!Как я могу получить снимок экрана со всех дисплеев на MAC?
#include <stdio.h>
#include <Foundation/Foundation.h>
int main(int argc, const char * argv[])
{
CGDisplayCount displayCount;
CGDirectDisplayID displays[32];
memset(&displays, 0, 32);
CGImageRef image[32];
CGRect rect = CGRectNull;
//grab the active displays
if (CGGetActiveDisplayList(32, displays, &displayCount) != kCGErrorSuccess)
{
printf("Error occured: %s\n", strerror(errno));
}
//go through the list
for (int i = 0; i < displayCount; i++)
{
if (CGDisplayMirrorsDisplay(displays[i]) != kCGNullDirectDisplay)
{
continue;
}
//return the smallest rectangle wich contain the two source rectangles
rect = CGRectUnion(rect, CGDisplayBounds(displays[i]));
if (CGRectIsNull(rect))
{
printf("Error: %s", strerror(errno));
}
}
CGFloat whitePoint[3];
CGFloat blackPoint[3];
CGFloat gamma[3];
CGFloat matrix[9];
CGColorSpaceRef colorSpace = CGColorSpaceCreateCalibratedRGB (&whitePoint[3], &blackPoint[3], &gamma[3], &matrix[9]);
if(colorSpace == NULL)
{
printf("Error: %s", strerror(errno));
}
//CGColorSpaceRef colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB);
//Create bmp context for image
CGContextRef context = CGBitmapContextCreate(NULL, //data
CGRectGetWidth(rect), //width
CGRectGetHeight(rect), //height
8, //bitPerComponent, for RGB must be 8
0, //if data == NULL, it must be 0
colorSpace, //colorspace device independent
kCGBitmapByteOrderDefault); //bitmap info
if(context == NULL)
{
printf("Error: %s", strerror(errno));
}
//Create a snapshot image
for (int i = 0; i < displayCount; i++)
{
image[i] = CGBitmapContextCreateImage(context);
if(image == NULL)
{
//printf("Error: %s", strerror(errno));
}
}
//Create destination to image
CFURLRef url = CFURLCreateWithString (kCFAllocatorDefault, CFSTR("out.bmp"), NULL);
if(url == NULL)
{
printf("Error: %s", strerror(errno));
}
CFErrorRef *error = NULL;
CFURLRef urlToFile = CFURLCreateFilePathURL (kCFAllocatorDefault, url, error);
if(urlToFile == NULL)
{
//printf("Error: %s", error);
}
CGImageDestinationRef imageDestination = CGImageDestinationCreateWithURL(urlToFile, kUTTypeBMP, displayCount, NULL);
if(imageDestination == NULL)
{
printf("Error: %s", strerror(errno));
}
//CGImageDestinationAddImage(imageDestination, image, NULL);
CGImageDestinationFinalize(imageDestination);
CGContextRelease(context);
CGColorSpaceRelease(colorSpace);
CFRelease(imageDestination);
return 0;
}
Apdate: Я пытался что-л я сказал ниже, но теперь я получаю ошибку:
Ошибки: CGBitmapContextCreate: неподдерживаемую комбинацию параметров: 8 целочисленных бит/компонент; 24 бит/пиксель; 3-компонентное цветовое пространство; kCGImageAlphaNone; 3456 байт/строка.
Действительно ??? Никто не может мне помочь ??? – neo
Функции, скорее всего, помогут вам, если вы проверите возвращаемые значения, как я предложил. –
@MarkSetchell, malloc работает правильно, я проверил его вчера. – neo