Как сохранить UIImage как файл BMP в каталоге документов

Аналогичные вопросы были заданы, но они всегда содержат ответ «использовать UIImagePNGRepresentation или UIImageJPEGRepresentation». Но это не будет работать для меня, поскольку я должен отправить этот файл во внешний веб-сервис, который принимает только изображения BMP.

Это то, что я реализовал до сих пор

-(NSData*)getBitmapRepresentationFromUIImage:(UIImage*)img{ CGImageRef cgiImg =[img CGImage]; CGColorSpaceRef colorSpaceRef = CGImageGetColorSpace(cgiImg); size_t bitsPerComponent = CGImageGetBitsPerComponent(cgiImg); size_t bytesPerRow = CGImageGetBytesPerRow(cgiImg); size_t dataSize = bytesPerRow * CGImageGetHeight(cgiImg); void* imgBuf = malloc(dataSize); CGContextRef bmpContext = CGBitmapContextCreate(imgBuf, CGImageGetWidth(cgiImg), CGImageGetHeight(cgiImg), bitsPerComponent, bytesPerRow, colorSpaceRef, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); CGContextDrawImage(bmpContext, CGRectMake(0, 0, CGImageGetWidth(cgiImg), CGImageGetHeight(cgiImg)), cgiImg); NSData* dataToReturn = nil; if (imgBuf!=NULL) { dataToReturn = [[NSData alloc] initWithBytes:imgBuf length:dataSize]; free(imgBuf); /*debug*/ [self saveNSDataAsBitmap:dataToReturn fileName:@"signature"]; /**/ } return dataToReturn; } -(void)saveNSDataAsBitmap:(NSData*)data fileName:(NSString*)name{ NSString* fileName = [NSString stringWithFormat:@"%@%@",name,@".bmp"]; NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; NSString *completePath = [documentsDirectory stringByAppendingPathComponent:fileName]; [data writeToFile:completePath atomically:YES]; } 

Это сохраняет файл в каталоге документов, но я не могу открыть этот файл с предварительным просмотром.

Что я делаю не так ? есть ли более простой способ?

РЕДАКТИРОВАТЬ

Теперь я добавил структуры для заголовка файла

 #pragma pack(1) typedef struct { UInt16 magic; //specifies the file type "BM" 0x424d UInt32 bfSize; //specifies the size in bytes of the bitmap file UInt16 bfReserved1; //reserved; must be 0 UInt16 bfReserved2; //reserved; must be 0 UInt32 bOffBits; } BmpFileHeaderStruct, *BmpFileHeaderStructRef; #pragma pack(0) #pragma pack(1) typedef struct { UInt32 biSize; int32_t biWidth; int32_t biHeight; UInt16 biPlanes; UInt16 biBitCount; UInt32 biCompression; UInt32 biSizeImage; int32_t biXPelsPerMeter; int32_t biYPelsPerMeter; UInt32 biClrUsed; UInt32 biClrImportant; } BmpFileInfoStruct,*BmpFileInfoStructRef; #pragma pack(0) 

Я также внедрил функцию для добавления заголовка к началу imgBuf

 -(void*)attatchBmpFileHeaderFor:(void*)imgBuf sizeOfBuff:(size_t)buffSize forImage:(CGImageRef)img{ BmpFileHeaderStruct headerStruct = {0}; headerStruct.magic = 0x424d; headerStruct.bfSize = buffSize; headerStruct.bOffBits = (sizeof(BmpFileHeaderStruct)*8) + (sizeof(BmpFileInfoStruct)*8);//hmmm ? BmpFileInfoStruct infoStruct = {0}; infoStruct.biSize = sizeof(BmpFileInfoStruct); infoStruct.biWidth = CGImageGetWidth(img); infoStruct.biHeight = CGImageGetHeight(img); infoStruct.biPlanes = 1; infoStruct.biBitCount = CGImageGetBitsPerPixel(img); infoStruct.biSizeImage = buffSize; void * fileBmpBuf = malloc(sizeof(BmpFileInfoStruct)+sizeof(BmpFileHeaderStruct)+sizeof(buffSize)); void *pIter = fileBmpBuf; memcpy(pIter, &headerStruct, sizeof(BmpFileHeaderStruct)); pIter += sizeof(BmpFileHeaderStruct); memcpy(pIter, &infoStruct, sizeof(BmpFileInfoStruct)); pIter += sizeof(BmpFileInfoStruct); memcpy(pIter, imgBuf, buffSize); return fileBmpBuf; } 

Это не работает, иногда он сбой из-за того, что освобожденный указатель ошибки не был выделен на последнем вызове memcpy, который является странным, поскольку я фактически не освобождаю данные в этой точке. Когда он работает, он создает файл, который не может быть прочитан.
Нужно ли мне вместо этого реализовать структуру bitmapv5header? Где я могу найти документацию о том, как я должен заполнить эту структуру значениями?

вы не можете просто сохранить данные, которые вы должны добавить для конкретного заголовка и палитры. Взгляните на формат файла: http://en.wikipedia.org/wiki/BMP_file_format

  • iOS UIImage как преобразовать черный в прозрачный программно?
  • Как получить массив UIImage, из папки, в Swift?
  • Создание единого изображения путем объединения нескольких изображений в iOS
  • iphone 6 vs iphone 5 image Соглашение об именах
  • новое качество изображения низкое. ios swift
  • Как разделить анимированный GIF на массив UIImages?
  • Повернуть изображение в UIImageView
  • как установить цвет фона в UIimage в быстром программировании
  • Устройство Retina iOS не отображает изображение @ 2X, оно показывает изображение 1X
  • Потеря ориентации изображения при преобразовании изображения в CGImage
  • Как получить UIImage определенной области в текущем экране ios
  • Interesting Posts

    iOS – UIImageWriteToSavedPhotosAlbum

    Как добавить пользовательский вид в ячейку JSQMessagesViewController, чтобы он включал один вид с некоторыми кнопками и текстовым видом?

    Как я могу нарисовать повернутый UIView с тенью, но без поворота тени

    Изменение версии в iTunes подключитесь до того, как она выйдет в прямом эфире

    как иметь двойную границу для ячейки

    iOS – импорт и форвардная декларация относительно setAlpha

    Эффективность поиска в регулярном выражении

    UIBezierPath рисует круг с разными штрихами

    Периферийные и центральные одновременно на iOS

    error "действительный профиль подготовки для этого исполняемого файла не найден"

    Каков наилучший способ получить текущую ориентацию для установки видов

    Сплит-эффект с использованием фильтров изображения ядра?

    В навигационной карте приложения с голосом в iOS

    ios swift: Как создать одну статическую ячейку в динамическом представлении таблицы?

    Как перенести ярлык и изменить его с помощью автоматического макета?

    Давайте будем гением компьютера.