Я борюсь с проблемой рисования файла eps на NSView
. Когда я впервые загружаю файл eps из файла и рисую его с помощью drawInRect:
, изображение отображается правильно. Однако изображение не будет нарисовано, когда я загружу его из файла архива.
Я подготовил грязный небольшой пример, который вы можете скопировать/вставить и попробовать. Создайте новый проект Cocoa App и добавьте его в метод делегата.
- (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:
. Поэтому, пожалуйста, обратите внимание на тот факт, что NSImage
с представлением NSEPSImageRep
, которое не содержит предварительного просмотра (из ветки ресурсов?) и загружается исключительно как команды eps, не отображается на NSView
правильно.
Любая помощь приветствуется.
loadedImage
, какиеNSImageRep
будут к нему прикреплены? Вы должны быть в состоянииNSLog
описать какloadedImage
, так и его изображения, чтобы увидеть, что там есть. - person gaige   schedule 10.06.2013NSKeyedArchiver
, и у нас не было проблем с ним. Тем не менее, мы разрываемNSImage
и сохраняемNSEPSImageRep
напрямую, чтобы убедиться, что мы получаем наивысшую точность (после того, как было задействовано кэширование, у нас возникли проблемы с получением лучшей версии, а не самой маленькой версии). Некоторые из этих проблем могли быть в более старых версиях OSX, так как этому коду на данный момент 3-4 года. Вы знаете, что файл будет EPS? В таком случае, вы можете просто сохранить версиюNSData
вместоNSImage
? - person gaige   schedule 10.06.2013NSKeyedArchiver
. Я попытался заархивироватьNSEPSImageRep
вместоNSImage
и снова сконструировалNSImage
с загруженнымNSEPSImageRep
, но безуспешно. Я тоже раньше с такой проблемой не сталкивался. Фактический код довольно старый и работал раньше. Я предполагаю, что он начал не работать после установки Base SDK на 10.8 в Xcode (но не уверен в этом, изменение его на 10.7 SDK тоже не помогло). - person cocoafan   schedule 10.06.2013NSEPSImageRep
, я сохранял данные EPS, используя[(NSEPSImageRep*)rep EPSRepresentation]
, что в основном эквивалентно сохранению исходных данных EPS (теоретически). Это продолжает работать для меня. - person gaige   schedule 10.06.2013NSImage
может содержать любое представлениеNSImageRep
. Есть ли элегантный и более общий способ (не относящийся к EPS) для сохранения и загрузки представлений? - person cocoafan   schedule 10.06.2013