Objective C – Sauvegarder UIImage en tant que fichier BMP

Des questions similaires ont été posées, mais elles contiennent toujours la réponse “utiliser UIImagePNGRepresentation ou UIImageJPEGRepresentation” qui ne me convient pas. Je dois enregistrer le fichier en tant que bitmap.

De ma compréhension, les données UIImage sont déjà un bitmap. Dans ce cas, je ne devrais pas avoir à créer un bitmap. Ou je J’ai trouvé quelqu’un qui a posté cette question mais je ne suis pas sûr de la réponse exacte car ce n’est pas clair pour moi. J’ai même été jusqu’à créer un tableau de pointeurs sur les caractères, mais je ne sais toujours pas comment l’enregistrer en tant que bitmap. Existe-t-il quelqu’un qui puisse m’aider à comprendre comment enregistrer UIImage en tant que bitmap? Ou dites-moi les étapes et je vais rechercher les étapes.

Je vous remercie.


MODIFIER:

J’ai trouvé ce tutoriel (avec code) pour convertir l’image en bitmap, mais le bitmap renvoyé est un caractère non signé *. Ou je suis sur le bon chemin ou je vais dans la mauvaise direction. Alors maintenant, je vais voir si je peux écrire le caractère non signé * dans un fichier .bmp.

Vous trouverez ci-dessous la catégorie que j’ai reconstituée pour UIImage et qui me permet d’accéder aux données brutes BGRA ainsi qu’aux données prêtes à être écrites sur le disque avec un en-tête bitmap approprié.

@interface UIImage (BitmapData) - (NSData *)bitmapData; - (NSData *)bitmapFileHeaderData; - (NSData *)bitmapDataWithFileHeader; @end # pragma pack(push, 1) typedef struct s_bitmap_header { // Bitmap file header UInt16 fileType; UInt32 fileSize; UInt16 reserved1; UInt16 reserved2; UInt32 bitmapOffset; // DIB Header UInt32 headerSize; UInt32 width; UInt32 height; UInt16 colorPlanes; UInt16 bitsPerPixel; UInt32 compression; UInt32 bitmapSize; UInt32 horizontalResolution; UInt32 verticalResolution; UInt32 colorsUsed; UInt32 colorsImportant; } t_bitmap_header; #pragma pack(pop) @implementation UIImage (BitmapData) - (NSData *)bitmapData { NSData *bitmapData = nil; CGImageRef image = self.CGImage; CGContextRef context = NULL; CGColorSpaceRef colorSpace; UInt8 *rawData; size_t bitsPerPixel = 32; size_t bitsPerComponent = 8; size_t bytesPerPixel = bitsPerPixel / bitsPerComponent; size_t width = CGImageGetWidth(image); size_t height = CGImageGetHeight(image); size_t bytesPerRow = width * bytesPerPixel; size_t bufferLength = bytesPerRow * height; colorSpace = CGColorSpaceCreateDeviceRGB(); if (colorSpace) { // Allocate memory for raw image data rawData = (UInt8 *)calloc(bufferLength, sizeof(UInt8)); if (rawData) { CGBitmapInfo bitmapInfo = kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst; context = CGBitmapContextCreate(rawData, width, height, bitsPerComponent, bytesPerRow, colorSpace, bitmapInfo); if (context) { CGRect rect = CGRectMake(0, 0, width, height); CGContextTranslateCTM(context, 0, height); CGContextScaleCTM(context, 1.0, -1.0); CGContextDrawImage(context, rect, image); bitmapData = [NSData dataWithBytes:rawData length:bufferLength]; CGContextRelease(context); } free(rawData); } CGColorSpaceRelease(colorSpace); } return bitmapData; } - (NSData *)bitmapFileHeaderData { CGImageRef image = self.CGImage; UInt32 width = (UInt32)CGImageGetWidth(image); UInt32 height = (UInt32)CGImageGetHeight(image); t_bitmap_header header; header.fileType = 0x4D42; header.fileSize = (height * width * 4) + 54; header.reserved1 = 0x0000; header.reserved2 = 0x0000; header.bitmapOffset = 0x00000036; header.headerSize = 0x00000028; header.width = width; header.height = height; header.colorPlanes = 0x0001; header.bitsPerPixel = 0x0020; header.compression = 0x00000000; header.bitmapSize = height * width * 4; header.horizontalResolution = 0x00000B13; header.verticalResolution = 0x00000B13; header.colorsUsed = 0x00000000; header.colorsImportant = 0x00000000; return [NSData dataWithBytes:&header length:sizeof(t_bitmap_header)]; } - (NSData *)bitmapDataWithFileHeader { NSMutableData *data = [NSMutableData dataWithData:[self bitmapFileHeaderData]]; [data appendData:[self bitmapData]]; return [NSData dataWithData:data]; } @end