2011-08-24 2 views
1

У меня есть NSBitmapImageRep, что я создаю следующим образом:NSBitmapImageRep генерироваться BMP не может быть прочитан на Windows,

+ (NSBitmapImageRep *)bitmapRepOfImage:(NSURL *)imageURL { 
    CIImage *anImage = [CIImage imageWithContentsOfURL:imageURL]; 
    CGRect outputExtent = [anImage extent]; 

    NSBitmapImageRep *theBitMapToBeSaved = [[NSBitmapImageRep alloc] 
             initWithBitmapDataPlanes:NULL pixelsWide:outputExtent.size.width 
             pixelsHigh:outputExtent.size.height bitsPerSample:8 samplesPerPixel:4 
             hasAlpha:YES isPlanar:NO colorSpaceName:NSDeviceRGBColorSpace 
             bytesPerRow:0 bitsPerPixel:0]; 

    NSGraphicsContext *nsContext = [NSGraphicsContext graphicsContextWithBitmapImageRep:theBitMapToBeSaved]; 

    [NSGraphicsContext saveGraphicsState]; 
    [NSGraphicsContext setCurrentContext: nsContext]; 
    CGPoint p = CGPointMake(0.0, 0.0); 

    [[nsContext CIContext] drawImage:anImage atPoint:p fromRect:outputExtent]; 

    [NSGraphicsContext restoreGraphicsState]; 

    return [[theBitMapToBeSaved retain] autorelease]; 
} 

И быть сохранены как BMP этот путь:

NSBitmapImageRep *original = [imageTools bitmapRepOfImage:fileURL]; 
NSData *converted = [original representationUsingType:NSBMPFileType properties:nil]; 
[converted writeToFile:filePath atomically:YES]; 

Дело здесь заключается в том, что файл BMP можно правильно читать и обрабатывать в Mac OSX, но под Windows он просто не загружается, как на этом скриншоте:

screenshot http://dl.dropbox.com/u/1661304/Grab/74a6dadb770654213cdd9290f0131880.png

Если файл открыт с помощью MS Paint (да, MS Paint может открыть его), а затем сохранена, но она будет работать.

Поблагодарите за руку здесь. :)

Заранее спасибо.

ответ

0

Я думаю, что основной причиной отказа вашего кода является то, что вы создаете свой NSBitmapImageRep с 0 бит на пиксель. Это означает, что ваш образ будет иметь ровно нулевую информацию. Вы почти наверняка хотите 32 бит на пиксель.

Однако ваш код невероятно свернутый способ получить NSBitmapImageRep из файла изображения на диске. Почему вы используете CIImage? Это объект Core Image, предназначенный для использования с фильтрами Core Image и не имеет смысла здесь вообще. Вы должны использовать NSImage или CGImageRef.

Ваш метод также плохо назван. Вместо этого следует назвать что-то вроде +bitmapRepForImageFileAtURL:, чтобы лучше указать, что он делает.

Кроме того, этот код не имеет смысла:

[[theBitMapToBeSaved retain] autorelease] 

Calling retain, а затем autorelease ничего не делает, потому что все это происходит в увеличиваем сохранить счет, а затем уменьшить его сразу же.

Вы несете ответственность за освобождение theBitMapToBeSaved, потому что вы создали его с помощью alloc. Поскольку он возвращается, вы должны позвонить ему autorelease. Ваш дополнительный вызов retain просто вызывает утечку без причины.

Попробуйте это:

+ (NSBitmapImageRep*)bitmapRepForImageFileAtURL:(NSURL*)imageURL 
{ 
    NSImage* image = [[[NSImage alloc] initWithContentsOfURL:imageURL] autorelease]; 
    return [NSBitmapImageRep imageRepWithData:[image TIFFRepresentation]]; 
} 

+ (NSData*)BMPDataForImageFileAtURL:(NSURL*)imageURL 
{ 
    NSBitmapImageRep* bitmap = [self bitmapRepForImageFileAtURL:imageURL]; 
    return [bitmap representationUsingType:NSBMPFileType properties:nil]; 
} 

Вам действительно нужно пересмотреть Cocoa Drawing Guide и Memory Management Guidelines, потому что кажется, что у вас возникли проблемы с некоторыми основными понятиями.

+0

Здравствуйте, прежде всего, за вашу помощь. Вы правы, что сохраняете] autorelease] не имеет никакого смысла. Ваш код кажется намного лучше моего предыдущего. Единственная проблема заключается в том, что BMP по-прежнему не может быть открыт встроенным средством просмотра файлов Windows, такой же точной ошибкой, как указано выше. (Вы также можете исправить свой второй метод, если кто-то захочет его использовать. Вы не можете вызывать себя, поскольку объект не выделен, а файлURL должен быть imageURL). – MegaEduX

+0

Вы * можете * вызывать self, потому что это метод класса, вызывающий метод другого класса. –

+0

Ну, я думаю, я всегда учусь. Знайте, что связано с проблемой BMP? – MegaEduX