我正在尝试创建模仿内置屏幕截图工具的mac osx的东西,如果你在视网膜监视器(320x240)中截取屏幕截图,结果的图像打开的大小与拍摄时相同,但是视网膜是dpi是144。
然而,无论我做什么,我似乎都无法做同样的事情。我可以使用完全相同的元数据,规格(据我所见)保存图像,并且它只是以双倍尺寸打开。
以下是内置屏幕截图图片中的数据 http://i.stack.imgur.com/tQBNo.png
这是我制作的图像中的数据 http://i.stack.imgur.com/F6jTg.png
我看到的唯一区别是XMP exif数据不同。 但是对于其中一个,我似乎无法弄清楚如何改变它,2,我不知道这有什么意义,所以我认为我仍然没有看到制作视网膜图像的东西。
我认为我错过了某种隐藏的标志,告诉预览用320x240打开内置屏幕截图,而不是像素大小,640x480
这是我的代码。 NSImageEXIFData似乎没有坚持
NSBitmapImageRep *bmpImageRep = [[NSBitmapImageRep alloc]
initWithBitmapDataPlanes:NULL
pixelsWide:640
pixelsHigh:480
bitsPerSample:8
samplesPerPixel:4
hasAlpha:YES
isPlanar:NO
colorSpaceName:NSCalibratedRGBColorSpace
bitmapFormat:NSAlphaFirstBitmapFormat
bytesPerRow:0
bitsPerPixel:0
];
bmpImageRep.size=NSMakeSize(320,240);
id profile = [NSData dataWithContentsOfFile: @"/Library/ColorSync/Profiles/Displays/Color LCD-FD6E9053-53B7-5224-5892-F9F7EC52CEF3.icc"];
[bmpImageRep setProperty:NSImageColorSyncProfileData withValue:profile];
NSDictionary *exif = [[NSDictionary alloc] initWithObjectsAndKeys:[NSNumber numberWithInt:640], kCGImagePropertyExifPixelXDimension, [NSNumber numberWithInt:480], kCGImagePropertyExifPixelYDimension, nil];
[bmpImageRep setProperty:NSImageEXIFData withValue:exif];
NSGraphicsContext *bitmapContext = [NSGraphicsContext graphicsContextWithBitmapImageRep:bmpImageRep];
[NSGraphicsContext saveGraphicsState];
[NSGraphicsContext setCurrentContext: bitmapContext];
NSRect bgRect = NSMakeRect(0,0,320,240);
[myImage drawInRect:bgRect fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0];
[NSGraphicsContext restoreGraphicsState];
NSData* pngData= [bmpImageRep representationUsingType:NSPNGFileType
properties:nil];
return pngData;
答案 0 :(得分:2)
该屏幕截图信息似乎存储在文件系统的扩展属性中,而不是特定格式的图像元数据中。这些扩展属性将与文件副本或打开/保存一起复制(只要应用程序不显式更改属性),而不是仅内容副本(ei创建新文件并复制原始文件的内容)。
您可以使用 xattr 命令行工具列出文件的扩展属性。以下是您对屏幕截图的期望:
com.apple.metadata:kMDItemIsScreenCapture com.apple.metadata:kMDItemScreenCaptureGlobalRect com.apple.metadata:kMDItemScreenCaptureType
sys / xattr.h 是包含操作文件扩展属性所需功能的标头。
答案 1 :(得分:1)
事实证明,OSX记录了使用屏幕截图工具捕获的图像,然后告诉预览以半尺寸打开该图像。因此实际上不可能在预览中创建一个打开一半大小的图像,除非你在某处弄乱了OS文件。但这并不重要,因为如果您打开使用Chrome中的屏幕截图工具拍摄的图像或预览之外的其他应用程序,它也会以双倍大小打开。所以它似乎只是Apple为Preview + Built-in Screenshots创建的特殊外壳。
这当然是所有个人的推测,因为我实际上找不到任何文档或更多信息 - 但是,我可以告诉你,我创建了一个内置截图图像的精确复制品。包括与图像关联的所有元数据和属性,并且在预览中仍然以不同方式打开。
我尝试更改NSBitmapImageRef,CGImage,CGContext中的任何相关属性,以尝试获取此属性。尝试更改NSEXIFProperties也无济于事。 (相关,无论你在元数据中改变什么,它都不会改变实际图像 - 结果证明它们只是标签。这是有道理的,因为我已经看到了带有.jpeg扩展名的GIF)
这是一篇有关缩放预览中打开的图像的人的文章,但这与我想做的相反
http://www.macissues.com/2014/03/29/adjust-retina-macbook-screenshots-to-be-actual-size/
无论如何,经过多次挖掘,我担心我现在必须将这个案子关闭。如果有人偶然发现并找到解决方案,请告诉我:))