UIImage

UIImage圖片處理(更改顏色,修改透明度,縮小,合併圖片)

(2013-10-29 11:34:53)

sg_trans.gif轉載

標籤:

it

分類:ios開發基礎

//遍歷圖片像素,更改圖片顏色

void ProviderReleaseData (void *info, constvoid *data, size_t size)

{

free((void*)data);

}


- (UIImage*) imageBlackToTransparent:(UIImage*) image

{

// 分配內存

constint imageWidth = image.size.width;

constint 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 = [UIImageimageWithCGImage: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)

{

returnnil;

}

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;

}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章