如何让dataWithEPSInsideRect输出矢量EPS而非封装位图的EPS格式
问题根源
- 你当前的写法是将NSImage加载到NSImageView后,调用视图的
dataWithEPSInsideRect:方法导出,这个方法导出的是视图光栅化渲染后的点阵结果,不管原始NSImage是否包含矢量信息,走这个路径导出都会得到封装了位图的EPS文件。 - 若你的
[graphicImage image]本身是从JPG、PNG等位图源生成的,本身就不包含矢量数据,无论用什么方法都无法导出矢量EPS。
矢量EPS导出方案
分两种场景处理:
场景1:原始图形是用NSBezierPath、Core Text等矢量API绘制生成的
不要通过NSImageView中转导出,直接创建EPS绘制上下文,在上下文内执行绘制逻辑,直接生成矢量EPS数据,示例代码如下:
NSRect exportBounds = NSMakeRect(0, 0, 导出宽度, 导出高度); NSMutableData *epsData = [NSMutableData data]; CGDataConsumerRef consumer = CGDataConsumerCreateWithCFData((CFMutableDataRef)epsData); CGRect mediaBox = exportBounds; CGContextRef epsContext = CGContextCreateEPS(consumer, &mediaBox, NULL); if (epsContext) { NSGraphicsContext *nsContext = [NSGraphicsContext graphicsContextWithCGContext:epsContext flipped:NO]; [NSGraphicsContext saveGraphicsState]; [NSGraphicsContext setCurrentContext:nsContext]; // 替换为你原本生成graphicImage的矢量绘制代码 [yourCustomBezierPath stroke]; [yourAttributedString drawInRect:exportBounds]; [NSGraphicsContext restoreGraphicsState]; CGContextRelease(epsContext); } CFRelease(consumer); // 直接将epsData写入文件即可得到矢量EPS
场景2:graphicImage是从PDF、原始矢量EPS等矢量文件加载的
不需要经过NSImageView中转,直接调用NSImage的内置方法获取矢量EPS数据即可:
NSData *epsData = [[graphicImage image] EPSRepresentation];
注意:只有NSImage的原始数据源为矢量格式时,该方法返回的才是矢量EPS,若原始数据源为位图,返回结果仍为封装位图的EPS。
内容的提问来源于stack exchange,提问作者GeraldTheGerm
相关产品推荐
相关产品推荐

