在 C++ 中使用 CGImageDestinationCreateWithURL 创建 CGImageDestinationRef returns NULL
Creating a CGImageDestinationRef with CGImageDestinationCreateWithURL in C++ returns NULL
我正在尝试使用一些 OSX 框架中可用的方法,但使用 CGImageDestinationCreateWithURL
创建 CGImageDestinationRef
目的地 returns NULL
我不知道我做错了什么。
我认为我遇到的问题是:
CGImageDestinationRef destination = CGImageDestinationCreateWithURL(url, kUTTypePNG, 1, NULL);
我使用的代码如下:
main.cpp:
#include <iostream>
#include <string>
#include <QuartzCore/QuartzCore.h>
#include <CoreServices/CoreServices.h>
#include <ImageIO/ImageIO.h>
int main(int argc, const char * argv[]) {
std::string baseImageOutput = "/Users/bogdan/Desktop";
std::string pathSeparator = "/";
std::string baseImageName = "image-";
std::string imageExtension = ".png";
CGDisplayCount displayCount;
CGDirectDisplayID displays[32];
// grab the active displays
CGGetActiveDisplayList(32, displays, &displayCount);
// go through the list
for (int i = 0; i < displayCount; i++) {
std::string imagePath = baseImageOutput + pathSeparator + baseImageName + std::to_string(i) + imageExtension;
const char *charPath = imagePath.c_str();
CFStringRef imageOutputPath = CFStringCreateWithCString(kCFAllocatorDefault, charPath, kCFURLPOSIXPathStyle);
// make a snapshot of the current display
CGImageRef image = CGDisplayCreateImage(displays[i]);
CFURLRef url = CFURLCreateWithString(kCFAllocatorDefault, imageOutputPath, NULL);
// The following CGImageDestinationRef variable is NULL
CGImageDestinationRef destination = CGImageDestinationCreateWithURL(url, kUTTypePNG, 1, NULL);
if (!destination) {
std::cout<< "The destination does not exist: " << imagePath << std::endl;
CGImageRelease(image);
return 1;
}
CGImageDestinationAddImage(destination, image, NULL);
if (!CGImageDestinationFinalize(destination)) {
std::cout << "Failed to write image to the path" << std::endl;;
CFRelease(destination);
CGImageRelease(image);
return 1;
}
CFRelease(destination);
CGImageRelease(image);
}
std::cout << "It Worked. Check your desktop" << std::endl;;
return 0;
}
我创建的目的地是否正确?
找到解决方案。
似乎 baseImageOutput
需要在前面加上 file://
,这样最后的 url 才有效,所以我们有
std::string baseImageOutput = "file:///Users/bogdan/Desktop";
而不是
std::string baseImageOutput = "/Users/bogdan/Desktop";
我正在尝试使用一些 OSX 框架中可用的方法,但使用 CGImageDestinationCreateWithURL
创建 CGImageDestinationRef
目的地 returns NULL
我不知道我做错了什么。
我认为我遇到的问题是:
CGImageDestinationRef destination = CGImageDestinationCreateWithURL(url, kUTTypePNG, 1, NULL);
我使用的代码如下:
main.cpp:
#include <iostream>
#include <string>
#include <QuartzCore/QuartzCore.h>
#include <CoreServices/CoreServices.h>
#include <ImageIO/ImageIO.h>
int main(int argc, const char * argv[]) {
std::string baseImageOutput = "/Users/bogdan/Desktop";
std::string pathSeparator = "/";
std::string baseImageName = "image-";
std::string imageExtension = ".png";
CGDisplayCount displayCount;
CGDirectDisplayID displays[32];
// grab the active displays
CGGetActiveDisplayList(32, displays, &displayCount);
// go through the list
for (int i = 0; i < displayCount; i++) {
std::string imagePath = baseImageOutput + pathSeparator + baseImageName + std::to_string(i) + imageExtension;
const char *charPath = imagePath.c_str();
CFStringRef imageOutputPath = CFStringCreateWithCString(kCFAllocatorDefault, charPath, kCFURLPOSIXPathStyle);
// make a snapshot of the current display
CGImageRef image = CGDisplayCreateImage(displays[i]);
CFURLRef url = CFURLCreateWithString(kCFAllocatorDefault, imageOutputPath, NULL);
// The following CGImageDestinationRef variable is NULL
CGImageDestinationRef destination = CGImageDestinationCreateWithURL(url, kUTTypePNG, 1, NULL);
if (!destination) {
std::cout<< "The destination does not exist: " << imagePath << std::endl;
CGImageRelease(image);
return 1;
}
CGImageDestinationAddImage(destination, image, NULL);
if (!CGImageDestinationFinalize(destination)) {
std::cout << "Failed to write image to the path" << std::endl;;
CFRelease(destination);
CGImageRelease(image);
return 1;
}
CFRelease(destination);
CGImageRelease(image);
}
std::cout << "It Worked. Check your desktop" << std::endl;;
return 0;
}
我创建的目的地是否正确?
找到解决方案。
似乎 baseImageOutput
需要在前面加上 file://
,这样最后的 url 才有效,所以我们有
std::string baseImageOutput = "file:///Users/bogdan/Desktop";
而不是
std::string baseImageOutput = "/Users/bogdan/Desktop";