Я сохраняю NSBitmapImageRep в BMP-файле (Snow Leopard). Кажется, нормально, когда я открываю его на macos. Но это делает ошибку на моем мультимедийном устройстве (которое может отображать любой файл BMP из Интернета). Я не могу понять, что это неправильно, но когда я смотрю внутри файла (с прохладным приложением hexfiend на MacOS), 2 вещи неправильно:Сохранение NSBitmapImageRep как файл NSBMPFileType. Неверные заголовки BMP и растровое содержимое
- заголовка имеет неверное значение для параметра biHeight: 4294966216 (шест = C8FBFFFF) заголовок имеет правильный параметр biWidth: 1920
- Первый пиксель в содержимом растрового изображения (после 54 байтов в формате BMP) соответствует верхнему левому углу исходного изображения. В исходном файле BMP и, как указано в формате BMP, сначала должен быть первый левый угол.
Чтобы объяснить полный рабочий процесс в моем приложении, у меня есть NSImageView, где я могу перетащить BMP-образ. Этот вид связан с NSImage. After a drag & drop У меня есть действие, чтобы сохранить это изображение (с некоторым текстовым рисунком над ним) в файл BMP.
Вот код для сохранения нового файла BMP:
CGColorSpaceRefcolorSpace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB);
CGContextRefcontext = CGBitmapContextCreate(NULL, (int)1920, (int)1080, 8, 4*(int)1920, colorSpace, kCGImageAlphaNoneSkipLast);
[duneScreenViewdrawBackgroundWithDuneFolder:self inContext:context inRect:NSMakeRect(0,0,1920,1080) needScale:NO];
if(folderType==DXFolderTypeMovie) {
[duneScreenViewdrawSynopsisContentWithDuneFolder:self inContext:context inRect:NSMakeRect(0,0,1920,1080) withScale:1.0];
}
CGImageRef backgroundImageRef = CGBitmapContextCreateImage(context);
NSBitmapImageRep*bitmapBackgroundImageRef = [[NSBitmapImageRepalloc] initWithCGImage:backgroundImageRef];
NSData*data = [destinationBitmap representationUsingType:NSBMPFileType properties:nil];
[data writeToFile:[NSStringstringWithFormat:@"%@/%@", folderPath,backgroundPath] atomically: YES];
Метод duneScreenViewdrawSynopsisContentWithDuneFolder использует CGContextDrawImage для рисования изображения. Метод duneScreenViewdrawSynopsis использует CoreText для рисования некоторого текста в том же контексте.
Знаете ли вы, что не так?