Я думаю, что основная причина неудачного кода заключается в том, что вы создаете NSBitmapImageRep
с 0 битами на пиксель.Это означает, что ваша репутация изображения будет содержать ровно ноль информации.Вы почти наверняка хотите 32 бита на пиксель.
Однако ваш код - это невероятно запутанный способ получения NSBitmapImageRep
из файла изображения на диске.С какой стати вы используете CIImage
?Это объект Core Image, предназначенный для использования с фильтрами Core Image и не имеющий здесь никакого смысла.Вы должны использовать NSImage
или CGImageRef
.
Ваш метод также имеет неправильное название.Вместо этого ему следует назвать что-то вроде +bitmapRepForImageFileAtURL:
, чтобы лучше указать, что он делает.
Кроме того, этот код не имеет смысла:
[[theBitMapToBeSaved retain] autorelease]
Вызов 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];
}
Вам действительно нужно просмотреть Руководство по рисованию какао и Рекомендации по управлению памятью , поскольку у вас возникают проблемы с некоторыми основными понятиями.