http://blog.csdn.net/sinat_30898863/article/details/50513556
一.更換圖片的背景顏色
/**
*? 改變圖片背景為白色
*? @param image 圖片源
*? @return 返回更改過背景后的圖片
*/
+ (UIImage*) 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);
// 創(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) {
// 此處把白色背景顏色給變?yōu)橥该?/p>
uint8_t* ptr = (uint8_t*)pCurPtr;
ptr[0] = 0;
}else{
// 改成下面的代碼纺念,會將圖片轉成想要的顏色
uint8_t* ptr = (uint8_t*)pCurPtr;
ptr[3] = 0; //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 resultUIImage;
}
void ProviderReleaseData (void *info, const void *data, size_t size)
{
free((void*)data);
}
二.改變圖片的透明度
/**
*? 改變圖片的透明度
*
*? @param alpha 透明度
*? @param image 圖片源
*
*? @return 返回透明度變化后的圖片
*/
+ (UIImage *)changeAlphaOfImageWith:(CGFloat)alpha withImage:(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;
}
三.圖片的合成
/**
*? 圖片合成
*
*? @param image1 源圖片
*? @param image2 目標圖片
*
*? @return 返回合成后的圖片
*/
+ (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;
}
四.壓縮圖片到指定大小
/**
*? 壓縮圖片到指定大小
*
*? @param img? 圖片源
*? @param size 指定的大小
*
*? @return 返回壓縮后的圖片
*/
+ (UIImage *)scaleToSize:(UIImage *)img size:(CGSize)size{
// 創(chuàng)建一個bitmap的context
// 并把它設置成為當前正在使用的context
UIGraphicsBeginImageContext(size);
// 繪制改變大小的圖片
[img drawInRect:CGRectMake(0, 0, size.width, size.height)];
// 從當前context中創(chuàng)建一個改變大小后的圖片
UIImage* scaledImage = UIGraphicsGetImageFromCurrentImageContext();
// 使當前的context出堆棧
UIGraphicsEndImageContext();
// 返回新的改變大小后的圖片
return scaledImage;
}