UIImage图片处理(更改颜色,修改透明度,缩小,合并图片)

  • Post author:
  • Post category:其他




//遍历图片像素,更改图片颜色



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 =

CGColorSpaceCreateDevice

RGB

();





CGContextRef

context =

CGBitmapContextCreate

(rgbImageBuf, imageWidth, imageHeight,

8

, bytesPerRow, colorSpace,




























kCGBitmapByteOrder32Litt

le

|

kCGImageAlphaNoneSkipLas

t

);





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 =

CGDataProviderCreateWith

Data

(

NULL

, rgbImageBuf, bytesPerRow * imageHeight,

ProviderReleaseData

);





CGImageRef

imageRef =

CGImageCreate

(imageWidth, imageHeight,

8

,

32

, bytesPerRow, colorSpace,























kCGImageAlphaLast

|

kCGBitmapByteOrder32Litt

le

, dataProvider,























NULL

,

true

,

kCGRenderingIntentDefaul

t

);






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


{






UIGraphicsBeginImageCont

extWithOptions

(image.

size

,


NO


,


0.0f


);










CGContextRef

ctx =

UIGraphicsGetCurrentCont

ext

();





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 =

UIGraphicsGetImageFromCu

rrentImageContext

();








UIGraphicsEndImageContex

t

();









return

newImage;


}




//合并2张图片


– (

UIImage

*)addImage:(

UIImage

*)image1 toImage:(

UIImage

*)image2 {






UIGraphicsBeginImageCont

ext

(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 =

UIGraphicsGetImageFromCu

rrentImageContext

();






UIGraphicsEndImageContex

t

();





return

resultingImage;


}







//



UIImage

缩放到指定大小尺寸:


– (

UIImage

*)scaleToSize:(

UIImage

*)img size:(

CGSize

)size{






//

创建一个

bitmap



context






//

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

context






UIGraphicsBeginImageCont

ext

(size);







//

绘制改变大小的图片





[img

drawInRect

:

CGRectMake

(


0


,


0


, size.

width

, size.

height

)];







//

从当前

context

中创建一个改变大小后的图片






UIImage

* scaledImage =

UIGraphicsGetImageFromCu

rrentImageContext

();






//

使当前的

context

出堆栈






UIGraphicsEndImageContex

t

();







//

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





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;




}






UIGraphicsBeginImageCont

ext

(size);





CGRect

rect =

CGRectMake

(

0

,

0

, size.

width

, size.

height

);




[image

drawInRect

:rect];






UIImage

*newing =

UIGraphicsGetImageFromCu

rrentImageContext

();






UIGraphicsEndImageContex

t

();





return

newing;


}