之前做过一个给毛笔字打分的一个APP,这是对里面图片一个简单处理
思路其实很简单
1.把图片处理成纯黑白的图片
2.把黑白像素以“0”,“1”表示
3.然后对比黑色像素(具体不能说)
/**
* 改变图片背景为白色
*
* @param image 图片源
*
* @return 返回更改过背景后的图片
*/
+ (NSString *) imageToTransparent:(UIImage*) image
{
// 分配内存
const int imageWidth = image.size.width;
const int imageHeight = image.size.height;
size_t bytesPerRow = imageWidth * 4;
uint32_t* rgbImageBuf = (uint32_t*)malloc(bytesPerRow * imageHeight);
// 创建context
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef context = CGBitmapContextCreate(rgbImageBuf, imageWidth, imageHeight, 8, bytesPerRow, colorSpace,
kCGBitmapByteOrder32Little | kCGImageAlphaNoneSkipLast);
CGContextDrawImage(context, CGRectMake(0, 0, imageWidth, imageHeight), image.CGImage);
NSMutableString *result = [[NSMutableString alloc] init];
// 遍历像素
int pixelNum = imageWidth * imageHeight;
uint32_t* pCurPtr = rgbImageBuf;
for (int i = 0; i < pixelNum; i++, pCurPtr++)
{
if ((*pCurPtr & 0xFFFFFF00) == 0xffffff00) {
// 此处把白色背景颜色给变为透明
// NSLog(@"pCurPtr000===%d",pCurPtr);
// uint8_t* ptr = (uint8_t*)pCurPtr;
// ptr[0] = 0;
uint8_t* ptr = (uint8_t*)pCurPtr;
ptr[3] = 0; //0~255
ptr[2] = 255;
ptr[1] = 0;
[result appendString:@"0,"];
}else{
[result appendString:@"1,"];
// NSLog(@"pCurPtr111===%d",pCurPtr);
// 改成下面的代码,会将图片转成想要的颜色
uint8_t* ptr = (uint8_t*)pCurPtr;
ptr[3] = 255; //0~255
ptr[2] = 0;
ptr[1] = 0;
}
}
// 将内存转成image
CGDataProviderRef dataProvider =CGDataProviderCreateWithData(NULL, rgbImageBuf, bytesPerRow * imageHeight, ProviderReleaseData);
CGImageRef imageRef = CGImageCreate(imageWidth, imageHeight,8, 32, bytesPerRow, colorSpace,
kCGImageAlphaLast |kCGBitmapByteOrder32Little, dataProvider,
NULL, true,kCGRenderingIntentDefault);
CGDataProviderRelease(dataProvider);
UIImage* resultUIImage = [UIImage imageWithCGImage:imageRef];
// 释放
CGImageRelease(imageRef);
CGContextRelease(context);
CGColorSpaceRelease(colorSpace);
return result;
}
//
+(unsigned char*) grayscalePixels:(UIImage *) image
{
// 每个像素的比特数,在这个例子中我们做的是灰度,所以1个字节= 8位
#define BITS_PER_PIXEL 8
//每个组件的比特数,在这个中它和bitsPerPixel是一样的,因为只有1个字节表示一个像素
#define BITS_PER_COMPONENT (BITS_PER_PIXEL)
// 每个像素的字节数,并不是很确定为什么要这样做但是基本上是位元除以每个组件的位元(在这个例子中是1)
#define BYTES_PER_PIXEL (BITS_PER_PIXEL/BITS_PER_COMPONENT)
// 定义颜色空间(在本例中为灰色)
CGColorSpaceRef colourSpace = CGColorSpaceCreateDeviceGray();
// 找出每一行的字节数(只是宽度乘以每个像素字节的字节数)
size_t bytesPerRow = image.size.width * BYTES_PER_PIXEL;
// 分配适当数量的内存来保存位图上下文
unsigned char* bitmapData = (unsigned char*) malloc(bytesPerRow*image.size.height);
// 创建位图上下文,我们将alpha设置为none,告诉位图我们不关心alpha值
CGContextRef context = CGBitmapContextCreate(bitmapData,image.size.width,image.size.height,BITS_PER_COMPONENT,bytesPerRow,colourSpace,kCGImageAlphaNone);
// 我们已经完成了彩色空间,所以没有必要保留它
CGColorSpaceRelease(colourSpace);
// 创建一个CGRect来定义我们想要的像素数量
CGRect rect = CGRectMake(0.0,0.0,image.size.width,image.size.height);
// 使用我们刚刚创建的矩形框绘制位图上下文,将核心图形图像作为图像源
CGContextDrawImage(context,rect,image.CGImage);
// 从位图上下文获取像素数据
unsigned char* pixelData = (unsigned char*)CGBitmapContextGetData(context);
//释放位图上下文,因为我们已经使用它了
CGContextRelease(context);
return pixelData;
#undef BITS_PER_PIXEL
#undef BITS_PER_COMPONENT
}