如何保存视网膜图像,NSBitmapImageRep

时间:2014-08-14 17:44:21

标签: objective-c image macos png retina-display

我正在尝试创建模仿内置屏幕截图工具的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;

2 个答案:

答案 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/

无论如何,经过多次挖掘,我担心我现在必须将这个案子关闭。如果有人偶然发现并找到解决方案,请告诉我:))

相关问题