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*) p_w_picpathBlackToTransparent:(UIImage*) p_w_picpath

{

// 分配內存

constint p_w_picpathWidth = p_w_picpath.size.width;

constint p_w_picpathHeight = p_w_picpath.size.height;

size_t bytesPerRow = p_w_picpathWidth * 4;

uint32_t* rgbImageBuf = (uint32_t*)malloc(bytesPerRow * p_w_picpathHeight);

 

// 創建context

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

CGContextRef context = CGBitmapContextCreate(rgbImageBuf, p_w_picpathWidth, p_w_picpathHeight, 8, bytesPerRow, colorSpace,

kCGBitmapByteOrder32Little |kCGImageAlphaNoneSkipLast);

CGContextDrawImage(context, CGRectMake(0, 0, p_w_picpathWidth, p_w_picpathHeight), p_w_picpath.CGImage);

 

// 遍歷像素

int pixelNum = p_w_picpathWidth * p_w_picpathHeight;

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;


}

 

}

 

// 將內存轉成p_w_picpath

CGDataProviderRef dataProvider = CGDataProviderCreateWithData(NULL, rgbImageBuf, bytesPerRow * p_w_picpathHeight, ProviderReleaseData);

CGImageRef p_w_picpathRef = CGImageCreate(p_w_picpathWidth, p_w_picpathHeight, 8, 32, bytesPerRow, colorSpace,

kCGImageAlphaLast | kCGBitmapByteOrder32Little, dataProvider,

NULL, true, kCGRenderingIntentDefault);

CGDataProviderRelease(dataProvider);

 

UIImage* resultUIImage = [UIImagep_w_picpathWithCGImage:p_w_picpathRef];

 

// 釋放

CGImageRelease(p_w_picpathRef);

CGContextRelease(context);

CGColorSpaceRelease(colorSpace);

// free(rgbImageBuf) 創建dataProvider時已提供釋放函數,這裏不用free

 

return resultUIImage;

}


//設置圖片透明度

- (UIImage *)p_w_picpathByApplyingAlpha:(CGFloat)alpha  p_w_picpath:(UIImage*)p_w_picpath

{

UIGraphicsBeginImageContextWithOptions(p_w_picpath.size,NO,0.0f);

 

CGContextRef ctx = UIGraphicsGetCurrentContext();

CGRect area = CGRectMake(0, 0, p_w_picpath.size.width, p_w_picpath.size.height);

 

CGContextScaleCTM(ctx,1, -1);

CGContextTranslateCTM(ctx,0, -area.size.height);

 

CGContextSetBlendMode(ctx, kCGBlendModeMultiply);

 

CGContextSetAlpha(ctx, alpha);

 

CGContextDrawImage(ctx, area, p_w_picpath.CGImage);

 

UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();


UIGraphicsEndImageContext();

 

return newImage;

}


//合併2張圖片

- (UIImage *)addImage:(UIImage *)p_w_picpath1 toImage:(UIImage *)p_w_picpath2 {

UIGraphicsBeginImageContext(p_w_picpath2.size);

 

// Draw p_w_picpath1

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

 

// Draw p_w_picpath2

[p_w_picpath2 drawInRect:CGRectMake(0, 0, p_w_picpath2.size.width, p_w_picpath2.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 *)p_w_picpath size:(CGSize)size

{

if (nil == p_w_picpath)

{

returnnil;

}

if (p_w_picpath.size.width<<span class="s5">200 && p_w_picpath.size.height<<span class="s5">200)

{

return p_w_picpath;

}

UIGraphicsBeginImageContext(size);

CGRect rect = CGRectMake(0, 0, size.width, size.height);

[p_w_picpath drawInRect:rect];

UIImage *newing = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

return newing;

}


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