- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在努力解决在 NSView
上绘制 eps 文件的问题。当我第一次从文件加载 eps 文件并使用 drawInRect:
绘制它时,图像显示正确。但是,当我从存档文件加载图像时,不会绘制图像。
我准备了一个肮脏的小示例,您可以复制/粘贴并尝试。创建一个新的 Cocoa App 项目并将其添加到委托(delegate)方法中。
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
// Just a sample eps file
NSURL *url = [NSURL URLWithString: @"http://embedded.eecs.berkeley.edu/concurrency/latex/figure.eps"];
NSImage *epsImage = [[[NSImage alloc] initWithContentsOfURL: url] autorelease];
// Encode data
NSMutableData *mutableData = [[[NSMutableData alloc] init] autorelease];
NSKeyedArchiver *coder = [[[NSKeyedArchiver alloc] initForWritingWithMutableData: mutableData] autorelease];
[coder encodeObject: epsImage forKey: @"image"];
[coder finishEncoding];
NSString *dataFile = [@"~/Desktop/image.data" stringByExpandingTildeInPath];
[mutableData writeToFile: dataFile atomically: YES];
// Decode data
NSData *data = [NSData dataWithContentsOfFile: dataFile];
NSKeyedUnarchiver *decoder = [[NSKeyedUnarchiver alloc] initForReadingWithData: data];
NSImage *loadedImage = [decoder decodeObjectForKey: @"image"];
// Draw image
NSRect rect;
rect.origin = NSZeroPoint;
rect.size = loadedImage.size;
NSView *view = [[NSApp mainWindow] contentView];
[view lockFocus];
[loadedImage drawInRect: rect fromRect: rect operation: NSCompositeSourceOver fraction: 1.0];
[view unlockFocus];
}
要证明第一个加载的图像绘制正确,只需将行 [loadedImage drawInRect:...]
更改为 [epsImage drawInRect:...]
。
我在这里使用 NSKeyedArchiver
和 NSKeyedUnarchiver
来模拟 encodeWithCoder:
和 initWithCoder:
。因此,请注意以下事实:具有 NSEPSImageRep
表示形式的 NSImage
不包含预览(来自资源分支?)并且纯粹作为 eps 命令加载,因此不会绘制正确的 NSView
。
感谢任何帮助。
最佳答案
由于 NSImage
上的缓存工作方式,我经常发现,如果我知道类型是什么,那么实际获取 NSImageRep
会更有效。
在我们的代码中,我们发现保存图像的最可靠方法是采用原始格式,但这需要将数据以原始格式保存在其他地方,或者从 NSImageRep< 请求数据
。不幸的是,NSImageRep
没有通用的 -(NSData*)data
方法,因此我们最终专门检查了各种类型的 NSImageRep
并保存它们的消失取决于我们对它们的了解。
幸运的是,加载很简单,因为 NSImage::initWithData:
将根据数据确定类型。
这是我们长期以来执行此操作的代码。基本上,它更喜欢 PDF,然后是 EPS,然后它会将任何它不理解的内容生成 TIFF。
+ (NSData*) dataWithImage:(NSImage*)image kindString:( NSString**)kindStringPtr
{
if (!image)
return nil;
NSData *pdfData=nil, *newData=nil, *epsData=nil, *imageData=nil;;
NSString *kindString=nil;
NSArray *reps = [image representations];
for (NSImageRep *rep in reps) {
if ([rep isKindOfClass: [NSPDFImageRep class]]) {
// we have a PDF, so save that
pdfData = [(NSPDFImageRep*)rep PDFRepresentation];
PDFDocument *doc = [[PDFDocument alloc] initWithData:pdfData];
newData = [doc dataRepresentation];
if (newData && ([newData length]<[pdfData length])) {
pdfData = newData;
}
break;
}
if ([rep isKindOfClass: [NSEPSImageRep class]]) {
epsData = [(NSEPSImageRep*)rep EPSRepresentation];
break;
}
}
if (pdfData) {
imageData=pdfData;
kindString= @"pdfImage";
} else if (epsData) {
imageData=epsData;
kindString=@"epsImage";
} else {
// make a big copy
NSBitmapImageRep *rep0 = [reps objectAtIndex:0];
if ([rep0 isKindOfClass: [NSBitmapImageRep class]]) {
[image setSize: NSMakeSize( [rep0 pixelsWide], [rep0 pixelsHigh])];
}
imageData = [image TIFFRepresentation];
kindString=@"tiffImage";
}
if (kindStringPtr)
*kindStringPtr=kindString;
return imageData;
}
一旦我们有了NSData*
,它就可以保存在 key 存档中、写入磁盘或其他任何内容。
返回时,加载 NSData*
,然后
NSImage *image = [[NSImage alloc] initWithData: savedData];
你应该已经准备好了。
关于macos - 如何在NSView上绘制EPS数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17019727/
我是一名优秀的程序员,十分优秀!