这段时间一直在做毕业设计,课题选的是用OC来实现app端的银行卡号码识别,每天都是在看资料看论文写代码,直到现在才想起来要把自己的过程在csdn记录一下(毕竟好记性不如烂笔头,靠我这脑子的记忆功能,估计一年后这些知识就忘光了)
首先还是记录下最常用的代码,那就是用位图模式编辑图片
- (UIImage *) editImage:(UIImage *)image{
CGImageRef imageRef;
imageRef = anImage.CGImage;
size_t width = CGImageGetWidth(imageRef);
size_t height = CGImageGetHeight(imageRef);
// rgb位构成
size_t bitsPerComponent = CGImageGetBitsPerComponent(imageRef);
// 像素的颜色位数
size_t bitsPerPixel = CGImageGetBitsPerPixel(imageRef);
// 位图每行的字节信息
size_t bytesPerRow = CGImageGetBytesPerRow(imageRef);
// 图片的颜色空间
CGColorSpaceRef colorSpace = CGImageGetColorSpace(imageRef);
// 位图的bitmap信息
CGBitmapInfo bitmapInfo = CGImageGetBitmapInfo(imageRef);
// 图像是否抗锯齿
bool shouldInterpolate = CGImageGetShouldInterpolate(imageRef);
CGColorRenderingIntent intent = CGImageGetRenderingIntent(imageRef);
// 图片数据源提供者
CGDataProviderRef dataProvider = CGImageGetDataProvider(imageRef);
// 拿到图片的字节数据
CFDataRef data;
UInt8* buffer;
data = CGDataProviderCopyData(dataProvider);
buffer = (UInt8*)CFDataGetBytePtr(data);
// 开始做处理
NSUInteger x, y;
for (y = 0; y < height; y++) {
for (x = 0; x < width; x++) {
UInt8* tmp; //字符串指针
tmp = buffer + y * bytesPerRow + x * 4; // RGBA四个颜色分量,tmp指针指向需要处理的像素
// 拿到rgba值
UInt8 red,green,blue,alpha;
red = *(tmp + 0);
green = *(tmp + 1);
blue = *(tmp + 2);
alpha = *(tmp + 3);
//这里就可以开始对每个像素点做处理了,比如要把rgb图转成灰度图,就让rgb的值都为brightness = 0.30*red + 0.59*green + 0.11*blue,这里省略代码
}
}
// 生成处理后的图片
CFDataRef effectedData = CFDataCreate(NULL, buffer, CFDataGetLength(data));
CGDataProviderRef effectedDataProvider = CGDataProviderCreateWithCFData(effectedData);
CGImageRef effectedCgImage;
UIImage* effectedCgImage = CGImageCreate(width, height,bitsPerComponent, bitsPerPixel, bytesPerRow,colorSpace, bitmapInfo, effectedDataProvider,NULL, shouldInterpolate, intent);
effectedImage = [[UIImage alloc] initWithCGImage:effectedCgImage];
// 一定要释放!!
CGImageRelease(effectedCgImage);
CFRelease(effectedDataProvider);
CFRelease(effectedData);
CFRelease(data);
return effectedImage;
}