CGImage载入的图片,查看bitmap详细信息的一段好用代码

http://blog.csdn.net/misol/article/details/7739127


在IOS中,载入一张图片到CGImage后,如果想查看图片的信息,这里有一段比较好的代码可以帮助你,其他的信息要显示可以参考苹果的API自己设置!


  1. -(void)imageDump:(NSString*)file  
  2. {  
  3.     UIImage* image = [UIImage imageNamed:file];  
  4.     CGImageRef cgimage = image.CGImage;  
  5.   
  6.     size_t width  = CGImageGetWidth(cgimage);  
  7.     size_t height = CGImageGetHeight(cgimage);  
  8.   
  9.     size_t bpr = CGImageGetBytesPerRow(cgimage);  
  10.     size_t bpp = CGImageGetBitsPerPixel(cgimage);  
  11.     size_t bpc = CGImageGetBitsPerComponent(cgimage);  
  12.     size_t bytes_per_pixel = bpp / bpc;  
  13.   
  14.     CGBitmapInfo info = CGImageGetBitmapInfo(cgimage);  
  15.   
  16.     NSLog(  
  17.         @"\n"  
  18.         "===== %@ =====\n"  
  19.         "CGImageGetHeight: %d\n"  
  20.         "CGImageGetWidth:  %d\n"  
  21.         "CGImageGetColorSpace: %@\n"  
  22.         "CGImageGetBitsPerPixel:     %d\n"  
  23.         "CGImageGetBitsPerComponent: %d\n"  
  24.         "CGImageGetBytesPerRow:      %d\n"  
  25.         "CGImageGetBitmapInfo: 0x%.8X\n"  
  26.         "  kCGBitmapAlphaInfoMask     = %s\n"  
  27.         "  kCGBitmapFloatComponents   = %s\n"  
  28.         "  kCGBitmapByteOrderMask     = %s\n"  
  29.         "  kCGBitmapByteOrderDefault  = %s\n"  
  30.         "  kCGBitmapByteOrder16Little = %s\n"  
  31.         "  kCGBitmapByteOrder32Little = %s\n"  
  32.         "  kCGBitmapByteOrder16Big    = %s\n"  
  33.         "  kCGBitmapByteOrder32Big    = %s\n",  
  34.         file,  
  35.         (int)width,  
  36.         (int)height,  
  37.         CGImageGetColorSpace(cgimage),  
  38.         (int)bpp,  
  39.         (int)bpc,  
  40.         (int)bpr,  
  41.         (unsigned)info,  
  42.         (info & kCGBitmapAlphaInfoMask)     ? "YES" : "NO",  
  43.         (info & kCGBitmapFloatComponents)   ? "YES" : "NO",  
  44.         (info & kCGBitmapByteOrderMask)     ? "YES" : "NO",  
  45.         (info & kCGBitmapByteOrderDefault)  ? "YES" : "NO",  
  46.         (info & kCGBitmapByteOrder16Little) ? "YES" : "NO",  
  47.         (info & kCGBitmapByteOrder32Little) ? "YES" : "NO",  
  48.         (info & kCGBitmapByteOrder16Big)    ? "YES" : "NO",  
  49.         (info & kCGBitmapByteOrder32Big)    ? "YES" : "NO"  
  50.     );  
  51.   
  52.     CGDataProviderRef provider = CGImageGetDataProvider(cgimage);  
  53.     NSData* data = (id)CGDataProviderCopyData(provider);  
  54.     [data autorelease];  
  55.     const uint8_t* bytes = [data bytes];  
  56.   
  57.     printf("Pixel Data:\n");  
  58.     for(size_t row = 0; row < height; row++)  
  59.     {  
  60.         for(size_t col = 0; col < width; col++)  
  61.         {  
  62.             const uint8_t* pixel =  
  63.                 &bytes[row * bpr + col * bytes_per_pixel];  
  64.   
  65.             printf("(");  
  66.             for(size_t x = 0; x < bytes_per_pixel; x++)  
  67.             {  
  68.                 printf("%.2X", pixel[x]);  
  69.                 if( x < bytes_per_pixel - 1 )  
  70.                     printf(",");  
  71.             }  
  72.   
  73.             printf(")");  
  74.             if( col < width - 1 )  
  75.                 printf(", ");  
  76.         }  
  77.   
  78.         printf("\n");  
  79.     }  
  80. }  


效果如下:::

  1. ===== a.png =====  
  2. CGImageGetHeight: 5  
  3. CGImageGetWidth:  3  
  4. CGImageGetColorSpace: <CGColorSpace 0x4d08ff0> (kCGColorSpaceDeviceRGB)  
  5. CGImageGetBitsPerPixel:     32  
  6. CGImageGetBitsPerComponent: 8  
  7. CGImageGetBytesPerRow:      20  
  8. CGImageGetBitmapInfo: 0x00000003  
  9.   kCGBitmapAlphaInfoMask     = YES  
  10.   kCGBitmapFloatComponents   = NO  
  11.   kCGBitmapByteOrderMask     = NO  
  12.   kCGBitmapByteOrderDefault  = NO  
  13.   kCGBitmapByteOrder16Little = NO  
  14.   kCGBitmapByteOrder32Little = NO  
  15.   kCGBitmapByteOrder16Big    = NO  
  16.   kCGBitmapByteOrder32Big    = NO  
  17. Pixel Data:  
  18. (00,00,00,FF), (FF,FF,FF,FF), (FF,00,00,FF), (00,FF,00,FF), (00,00,FF,FF)  
  19. (00,00,00,FF), (FF,FF,FF,FF), (FF,00,00,FF), (00,FF,00,FF), (00,00,FF,FF)  
  20. (FF,FF,FF,00), (FF,FF,FF,00), (FF,FF,FF,00), (FF,FF,FF,00), (FF,FF,FF,00)  
  21.   
  22.   
  23. ===== b.png =====  
  24. CGImageGetHeight: 5  
  25. CGImageGetWidth:  3  
  26. CGImageGetColorSpace: <CGColorSpace 0x4d08ff0> (kCGColorSpaceDeviceRGB)  
  27. CGImageGetBitsPerPixel:     24  
  28. CGImageGetBitsPerComponent: 8  
  29. CGImageGetBytesPerRow:      15  
  30. CGImageGetBitmapInfo: 0x00000000  
  31.   kCGBitmapAlphaInfoMask     = NO  
  32.   kCGBitmapFloatComponents   = NO  
  33.   kCGBitmapByteOrderMask     = NO  
  34.   kCGBitmapByteOrderDefault  = NO  
  35.   kCGBitmapByteOrder16Little = NO  
  36.   kCGBitmapByteOrder32Little = NO  
  37.   kCGBitmapByteOrder16Big    = NO  
  38.   kCGBitmapByteOrder32Big    = NO  
  39. Pixel Data:  
  40. (00,00,00), (FF,FF,FF), (FF,00,00), (00,FF,00), (00,00,FF)  
  41. (00,00,00), (FF,FF,FF), (FF,00,00), (00,FF,00), (00,00,FF)  
  42. (00,00,00), (FF,FF,FF), (FF,00,00), (00,FF,00), (00,00,FF) 
查看位图的信息(右键查看): 1.文件头 2.信息头 3.RGB掩码(如果有的话) 显示出来的形式如下: BITMAPFILEHEADER* = 0x02800048 BITMAPFILEHEADER .bfType = 0x4D42 .bfSize = 552158 .bfReserved1 = 0 .bfReserved2 = 0 .bfOffBits = 66 BITMAPINFOHEADER .biSize = 40 .biWidth = 353 .biHeight = 391 .biPlanes = 1 .biBitCount = 32 .biCompression = BI_BITFIELDS .biSizeImage = 552092 .biXPelsPerMeter = 0 .biYPelsPerMeter = 0 .biClrUsed = 0 .biClrImportant = 0 Red Mask = 00FF0000 Green Mask = 0000FF00 Blue Mask = 000000FF 说明: 1.第一行为内存中malloc出来的地址,由于是虚拟内存,不看也罢 2.该程序不止可以查看BITMAPINFOHEADER类型的位图, 其余三种类型也可查看,分别为: BITMAPCOREHEADER、BITMAPV4HEADER、BITMAPV5HEADER 3.最后三行的RGB Mask是颜色掩码,对于BITMAPINFOHEADER类型来说,不一定有。 4.右键功能是查看信息,左键是左右镜像操作,由于是底层数据直接每行左右互换, 而对于1、4位深的这两种位图,底层数据操作涉及位操作,而我还在写这个位图类, 故暂不支持,只支持8位以上的水平镜像操作。 5.支持剪切板操作,并且是以CF_DIB或CF_DIBV5呼叫GetClipboardData函数的, 复制时,也是以该参数呼叫SetClipboardData函数的。 你可以复制其他地方的图片过来,以查看图片属性。 6.程序中运行中保存在内存中的图片BITMAPFILEHEADER*指针,不是HBITMAP, 呼叫的显示函数是SetDIBitsToDevice函数。 7.鼠标在图片上移动是,右边填充鼠标点的颜色,标题栏也有相关显示。 下边显示鼠标点附近11*11像素范围的放大图像,正中间用十字叉线画出。 取色是直接在底层取数据解析。 8.改程序在《windows程序设计》上的一个例子改编而来,并且正在完善该位图类中, 以加入更多丰富的底层操作功能。 改试验程序主要供想研究位图结构的人查看用。 9.windows搞出了4种位图种类,真作孽~~ 另,16、24、32位深的位图也可以有颜色表的,该程序已考虑在内。 10.下面四种压缩格式暂不支持: BI_RLE8、BI_RLE4、BI_JPEG、BI_PNG 11.随带的附件中,有几张不同格式的位图,你可以试验打开查看。 有问题联系:hastings1986@163.com
iOS中实现图片识别文字功能可以使用苹果提供的Vision框架,以下是基本的实现步骤: 1. 导入Vision框架:在Xcode中,选中项目,选择General -> Linked Frameworks and Libraries,点击+号,搜索Vision并添加。 2. 创建一个VNImageRequestHandler:这个类用于处理图像请求。可以通过UIImage对象或者CMSampleBufferRef对象创建VNImageRequestHandler。 3. 创建一个VNRecognizeTextRequest:这个类用于识别图像中的文字。 4. 将VNRecognizeTextRequest对象添加到VNImageRequestHandler中。 5. 执行VNImageRequestHandler的perform方法开始识别。 6. 处理识别结果:VNRecognizeTextRequest的结果是一个VNRecognizedTextObservation对象数组,每个对象包含了识别出来的一个文本区域。 以下是示例代码: ```swift import Vision func recognizeText(image: UIImage) { guard let cgImage = image.cgImage else { return } let requestHandler = VNImageRequestHandler(cgImage: cgImage, options: [:]) let request = VNRecognizeTextRequest(completionHandler: handleTextRecognition) do { try requestHandler.perform([request]) } catch { print(error.localizedDescription) } } func handleTextRecognition(request: VNRequest, error: Error?) { guard let observations = request.results as? [VNRecognizedTextObservation] else { return } for observation in observations { guard let topCandidate = observation.topCandidates(1).first else { continue } print(topCandidate.string) } } ``` 在这个例子中,我们先将UIImage对象转化为CGImage对象,然后创建了一个VNImageRequestHandler和一个VNRecognizeTextRequest对象。最后执行VNImageRequestHandler的perform方法,开始识别。当识别完成后,会调用handleTextRecognition方法处理结果。在这个例子中,我们只是简单地将识别出来的文本打印出来。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值