iOS图片的一些处理操作(背景色,透明度,合成,大小)

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);

// 创建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{

// 改成下面的代码,会将图片转成想要的颜色

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{

// 创建一个bitmap的context

// 并把它设置成为当前正在使用的context

UIGraphicsBeginImageContext(size);

// 绘制改变大小的图片

[img drawInRect:CGRectMake(0, 0, size.width, size.height)];

// 从当前context中创建一个改变大小后的图片

UIImage* scaledImage = UIGraphicsGetImageFromCurrentImageContext();

// 使当前的context出堆栈

UIGraphicsEndImageContext();

// 返回新的改变大小后的图片

return scaledImage;

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容