You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 23:27:03