进公司第一个项目是做一个红外测温仪的。由于仪器传输过来的图片数据是RGB565格式的,这种格式的图片是一种位图(Bitmap),并不能直接展示出来。一般是转成UIImge。
趁着清明放假整理一下。(本来春节放假就应该整理的,后来一直拖拖,项目中遇到的问题还是要经常整理的)
还是一次做这种项目,不会,那只有去找资料。后来找来找去也没有找到什么,最后找到一个很久以前别人写的一篇帖子。根据帖子写的方法,然后将自己接受的数据处理好后传进去,发现效果并不好,后来把里面的参数调了个边也没有把图片质量优化好。最后只有先搁置一段时间,等把项目其他功能完善好了再说。后来客户不满意图片质量,于是又开始找方法进行优化。后来的思路是iOS应该不支持RGB565,然后就想办法转成RGB8888(RGB32),然后在将RGB8888(RGB32)转成UIImage。
///图像转换方法 RGB32
+ (UIImage *)rgb565ToUIImage:(Byte *)rawData width:(int)width height:(int)height{
const size_t bufferLength = width * height * 2;
//防止在初始化时数据为空造成崩溃
if (rawData == NULL) {
return nil;
}
NSData *data = [NSData dataWithBytes:rawData length:bufferLength];
NSData *RGB8888Data = [self RGB8888Data:data width:width height:height];
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGDataProviderRef provider = CGDataProviderCreateWithCFData((CFDataRef)RGB8888Data);
//Creating CGImage from cv::Mat
CGImageRef imageRef = CGImageCreate(width, //width
height, //height
8, //bits per component
32, //bits per pixel
width * 4, //bytesPerRow
colorSpace, //colorspace
kCGImageAlphaNoneSkipLast |
kCGImageByteOrderMask, // bitmap info
provider, //CGDataProviderRef
NULL, //decode
true, //should interpolate
kCGRenderingIntentDefault //intent
);
//Getting UIImage from CGImage
UIImage *finalImage = [UIImage imageWithCGImage:imageRef];
CGImageRelease(imageRef);
CGDataProviderRelease(provider);
CGColorSpaceRelease(colorSpace);
return finalImage;
}
这里的data就是接收到的一帧完整的RGB565图片。通过转换就可以得到需要的图片。
以下就是最后转换的图片
1.png 2.png 3.png
网友评论