轉(zhuǎn)自:http://blog.sina.com.cn/s/blog_64cfe8f00101pm3x.html
//遍歷圖片像素,更改圖片顏色
void ProviderReleaseData (void *info, const void data, size_t size)
{
free((void)data);
}
-
(UIImage) imageBlackToTransparent:(UIImage) image
{
// 分配內(nèi)存
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);// 創(chuàng)建context
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef context = CGBitmapContextCreate(rgbImageBuf, imageWidth, imageHeight, 8, bytesPerRow, colorSpace,
kCGBitmapByteOrder32Little | kCGImageAlphaNoneSkipLast);
CGContextDrawImage(context, CGRectMake(0, 0, imageWidth, imageHeight), image.CGImage);// 遍歷像素
int pixelNum = imageWidth * imageHeight;
uint32_t* pCurPtr = rgbImageBuf;
for (int i = 0; i < pixelNum; i++, pCurPtr++)
{
if ((pCurPtr & 0xFFFFFF00) == 0xffffff00) // 將白色變成透明
{
uint8_t ptr = (uint8_t)pCurPtr;
ptr[0] = 0;
}
else
{
// 改成下面的代碼,會(huì)將圖片轉(zhuǎn)成想要的顏色
uint8_t ptr = (uint8_t*)pCurPtr;
ptr[3] = 0; //0~255
ptr[2] = 0;
ptr[1] = 0;}
}
// 將內(nèi)存轉(zhuǎn)成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);
// free(rgbImageBuf) 創(chuàng)建dataProvider時(shí)已提供釋放函數(shù),這里不用freereturn resultUIImage;
}
//設(shè)置圖片透明度
-
(UIImage )imageByApplyingAlpha:(CGFloat)alpha image:(UIImage)image
{
UIGraphicsBeginImageContextWithOptions(image.size, NO, 0.0f);CGContextRef ctx = UIGraphicsGetCurrentContext();
CGRect area = CGRectMake(0, 0, image.size.width, image.size.height);CGContextScaleCTM(ctx, 1, -1);
CGContextTranslateCTM(ctx, 0, -area.size.height);CGContextSetBlendMode(ctx, kCGBlendModeMultiply);
CGContextSetAlpha(ctx, alpha);
CGContextDrawImage(ctx, area, image.CGImage);
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}
//合并2張圖片
-
(UIImage *)addImage:(UIImage *)image1 toImage:(UIImage *)image2 {
UIGraphicsBeginImageContext(image2.size);// Draw image1
[image1 drawInRect:CGRectMake(0, 0, image1.size.width, image1.size.height)];// Draw image2
[image2 drawInRect:CGRectMake(0, 0, image2.size.width, image2.size.height)];UIImage *resultingImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return resultingImage;
}
//將UIImage縮放到指定大小尺寸:
- (UIImage *)scaleToSize:(UIImage )img size:(CGSize)size{
// 創(chuàng)建一個(gè)bitmap的context
// 并把它設(shè)置成為當(dāng)前正在使用的context
UIGraphicsBeginImageContext(size);
// 繪制改變大小的圖片
[img drawInRect:CGRectMake(0, 0, size.width, size.height)];
// 從當(dāng)前context中創(chuàng)建一個(gè)改變大小后的圖片
UIImage scaledImage = UIGraphicsGetImageFromCurrentImageContext();
// 使當(dāng)前的context出堆棧
UIGraphicsEndImageContext();
// 返回新的改變大小后的圖片
return scaledImage;
}
//根據(jù)圖片的大小等比例壓縮返回圖片
-(UIImage *)fitSmallImage:(UIImage *)image size:(CGSize)size
{
if (nil == image)
{
return nil;
}
if (image.size.width<<span class="s5">200 && image.size.height<<span class="s5">200)
{
return image;
}
UIGraphicsBeginImageContext(size);
CGRect rect = CGRectMake(0, 0, size.width, size.height);
[image drawInRect:rect];
UIImage *newing = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newing;
}