-(UIImage*)imageBlackToTransparent:(UIImage*)imagewithRed:(CGFloat)redandGreen:(CGFloat)greenandBlue:(CGFloat)bluewithEdge:(int)value{ //分配内存 constintimageWidth=image.size.width; constintimageHeight=image.size.height; size_tbytesPerRow=imageWidth*4; //创建context uint32_t*rgbImageBuf=(uint32_t*)malloc(bytesPerRow*imageHeight); CGColorSpaceRefcolorSpace=CGColorSpaceCreateDeviceRGB(); CGContextRefcontext=CGBitmapContextCreate(rgbImageBuf,imageWidth,imageHeight,8,bytesPerRow,colorSpace, kCGBitmapByteOrder32Little|kCGImageAlphaNoneSkipLast); CGContextDrawImage(context,CGRectMake(0,0,imageWidth,imageHeight),image.CGImage); //遍历像素 intpixelNum=imageWidth*imageHeight; uint32_t*pCurPtr=rgbImageBuf; for(inti=0;i<pixelNum;i++,pCurPtr++){ if((*pCurPtr&0xFFFFFF00)<value)//将白色变成透明 { //改成下面的代码,会将图片转成想要的颜色 uint8_t*ptr=(uint8_t*)pCurPtr; ptr[3]=red;//0~255 ptr[2]=green; ptr[1]=blue; } else { //变透明 uint8_t*ptr=(uint8_t*)pCurPtr; ptr[0]=0; } } //输出图片 CGDataProviderRefdataProvider=CGDataProviderCreateWithData(NULL,rgbImageBuf,bytesPerRow*imageHeight,ProviderReleaseData); CGImageRefimageRef=CGImageCreate(imageWidth,imageHeight,8,32,bytesPerRow,colorSpace, kCGImageAlphaLast|kCGBitmapByteOrder32Little,dataProvider, NULL,true,kCGRenderingIntentDefault); CGDataProviderRelease(dataProvider); UIImage*resultUIImage=[UIImageimageWithCGImage:imageRef]; //清理空间 CGImageRelease(imageRef); CGContextRelease(context); CGColorSpaceRelease(colorSpace); returnresultUIImage; } 复制代码//去除图片的白色背景
网上还有其他解决办法尝试之后貌似没有效果,可能是我操作失误,知道原因希望指出,只是个人的一个记录知识点
//接近白色 //将像素点转成子节数组来表示---ARGB //ptr[0]:透明度,ptr[1]:R,ptr[2]:G,ptr[3]:B //分别取出RGB值后。进行判断需不需要设成透明。 uint8_t*ptr=(uint8_t*)pCurPtr; if(ptr[1]>140&&ptr[2]>140&&ptr[3]>140){ //当RGB值都大于140则比较接近白色的都将透明度设为0 //demo中的图片有点灰,所以设置了140,可以根据需要自行设置 ptr[0]=0; } } 复制代码for(inti=0;i<pixelNum;i++,pCurPtr++){