UIImage图片处理(更改颜色,修改透明度,缩小,合并图片)
2016-06-27 23:07
537 查看
//遍历图片像素,更改图片颜色
void ProviderReleaseData (void *info, const void *data, size_t size)
{
free((void*)data);
}
- (UIImage*) imageBlackToTransparent:(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);
// free(rgbImageBuf) 创建dataProvider时已提供释放函数,这里不用free
return resultUIImage;
}
//设置图片透明度
- (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{
// 创建一个bitmap的context
// 并把它设置成为当前正在使用的context
UIGraphicsBeginImageContext(size);
// 绘制改变大小的图片
[img drawInRect:CGRectMake(0, 0,
size.width, size.height)];
// 从当前context中创建一个改变大小后的图片
UIImage* scaledImage = UIGraphicsGetImageFromCurrentImageContext();
// 使当前的context出堆栈
UIGraphicsEndImageContext();
// 返回新的改变大小后的图片
return scaledImage;
}
//根据图片的大小等比例压缩返回图片
-(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;
}
void ProviderReleaseData (void *info, const void *data, size_t size)
{
free((void*)data);
}
- (UIImage*) imageBlackToTransparent:(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);
// free(rgbImageBuf) 创建dataProvider时已提供释放函数,这里不用free
return resultUIImage;
}
//设置图片透明度
- (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{
// 创建一个bitmap的context
// 并把它设置成为当前正在使用的context
UIGraphicsBeginImageContext(size);
// 绘制改变大小的图片
[img drawInRect:CGRectMake(0, 0,
size.width, size.height)];
// 从当前context中创建一个改变大小后的图片
UIImage* scaledImage = UIGraphicsGetImageFromCurrentImageContext();
// 使当前的context出堆栈
UIGraphicsEndImageContext();
// 返回新的改变大小后的图片
return scaledImage;
}
//根据图片的大小等比例压缩返回图片
-(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;
}
相关文章推荐
- EasyUI 之 dataGrid前台状态值转换
- 1099. Build A Binary Search Tree (30)
- MGSwipeTableCell的使用(UItabelCell 滑动拉出多个按钮)
- iOS UITableView
- iOS UI基础1
- 阿里巴巴-德鲁伊druid连接池配置
- STL---deque---学习
- aapt.exe'' finished with non-zero exit value -1073741819
- hdu_3804_Query on a tree(树链剖分)
- hdu_3804_Query on a tree(树链剖分)
- truetype技术和矢量字库的技术原理及实现
- Gradle中的buildScript代码块
- jsp include flush true
- Confluence(五)--确认破解信息和数据库展示
- APUE(4)---文件和目录 (2)
- Confluence(四)--配置
- Building a Dynamic UI with Fragments ---- Communicating with Other Fragme (三)
- confluence(三)--关联数据库
- confluence(二)--破解
- android 控件ui