压缩图片
func imageCompress(targetWidth:CGFloat) -> UIImage {
let targetHeight = (targetWidth/width)*height
UIGraphicsBeginImageContext(CGSize(width: targetWidth, height: targetHeight))
self.draw(in: CGRect(x: 0, y: 0, width: targetWidth, height: targetHeight))
let newImage : UIImage = UIGraphicsGetImageFromCurrentImageContext()!
UIGraphicsEndImageContext()
return newImage
}
图片强制解压缩
- (UIImage*)imageDetail:(UIImage *)image {
CGImageRef imageRef = image.CGImage;
NSUInteger width = CGImageGetWidth(imageRef)/3;
NSUInteger height = CGImageGetHeight(imageRef)/3;
CGColorSpaceRef colorSpace = CGImageGetColorSpace(imageRef);
CGContextRef contextRef =
CGBitmapContextCreate(nil,
width,
height,
8,
4*width,
colorSpace,
kCGImageAlphaNoneSkipLast);
CGContextDrawImage(contextRef, CGRectMake(0, 0, width, height), imageRef);
imageRef = CGBitmapContextCreateImage(contextRef);
CGContextRelease(contextRef);
return [UIImage imageWithCGImage:imageRef scale:image.scale orientation:UIImageOrientationUp];
}
模糊图片
func blurImage(blurValue:NSNumber) -> UIImage {
let context = CIContext(options: [CIContextOption.useSoftwareRenderer: true])
let ciImage = CoreImage.CIImage(image: self)
let blurFilter = CIFilter(name: "CJGaussianBlur")
blurFilter?.setValue(ciImage, forKey: kCIInputImageKey)
blurFilter?.setValue(blurValue, forKey: "inputRadius")
let imageRef = context.createCGImage((blurFilter?.outputImage)!, from: (ciImage?.extent)!)
let newImage = UIImage(cgImage: imageRef!)
return newImage
}
图片设置马赛克
- 马赛克就是让图片看上去模糊不清。将特定区域的像素点设置为同一种颜色,整体就会变得模糊,区域块越大越模糊,越小越接近于原始像素。
- 同样使用强制解压缩操作,操作像素点,马赛克部分:
① 设置区域大小;
② 在该区域获取一个像素点(第一个)作为整个区域的取色;
③ 将取色设置到区域中;
④ 取下一个区域同上去色设置区域。
- (UIImage*)mosaicWithImage:(UIImage *)image {
CGImageRef imageRef = image.CGImage;
NSUInteger width = CGImageGetWidth(imageRef);
NSUInteger height = CGImageGetWidth(imageRef);
CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();
UInt32 *imagePiexl = (UInt32 *)calloc(width*height, sizeof(UInt32));
CGContextRef contextRef = CGBitmapContextCreate(imagePiexl, width, height, 8, 4*width, colorSpaceRef, kCGImageAlphaNoneSkipLast);
CGContextDrawImage(contextRef, CGRectMake(0, 0, width, height), imageRef);
UInt8 *bitmapPixels = CGBitmapContextGetData(contextRef);
UInt8 *pixels[4] = {0};
NSUInteger currentPixels = 0;
NSUInteger preCurrentPiexls = 0;
NSUInteger mosaicSize = 20;
for (NSUInteger i = 0; i < height - 1; i++) {
for (NSUInteger j = 0 ; j < width - 1; j++) {
currentPixels = i * width + j;
if (i % mosaicSize == 0) {
if (j % mosaicSize == 0) {
memcpy(pixels, bitmapPixels + 4 * currentPixels, 4);
} else {
memcpy(bitmapPixels + 4 * currentPixels, pixels, 4);
}
} else {
preCurrentPiexls = (i - 1) * width + j;
memcpy(bitmapPixels + 4 * currentPixels, bitmapPixels + 4 * preCurrentPiexls, 4);
}
}
}
CGImageRef finalRef = CGBitmapContextCreateImage(contextRef);
CGContextRelease(contextRef);
CGColorSpaceRelease(colorSpaceRef);
free(imagePiexl);
return [UIImage imageWithCGImage:finalRef scale:image.scale orientation:UIImageOrientationUp];
}
memcpy(void *__dst, const void *__src, size_t __n);
图片置灰
+ (UIImage*)getGrayImage:(UIImage*)sourceImage {
int width = sourceImage.size.width;
int height = sourceImage.size.height;
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray();
CGContextRef context = CGBitmapContextCreate (nil,width,height,8,0,colorSpace,kCGImageAlphaNone);
CGColorSpaceRelease(colorSpace);
if (context == NULL) {
return nil;
}
CGContextDrawImage(context,CGRectMake(0, 0, width, height), sourceImage.CGImage);
UIImage *grayImage = [UIImage imageWithCGImage:CGBitmapContextCreateImage(context)];
CGContextRelease(context);
return grayImage;
}
- image的渲染置灰: imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];这个方法,是给当前的image做一个渲染效果,后面的参数是一个枚举,这个template代表始终使用前景色tintcolor来渲染,接着设置tintcolor,imageview的背景色不会变灰,可以正常设置,而显示的图片是灰色;
- (void)updateUIForFollow:(BOOL)isFollow {
if (isFollow) {
self.belowImage.image = [UIImage imageNamed:@"new_room_half_btn_heard"];
} else {
UIImage *heartImage = [UIImageimageNamed:@"new_room_half_btn_broken_heard"];
UIImage *newHeartImage = [heartImage imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
[self.belowImv setImage:newHeartImage];
self.belowImv.tintColor = [UIColor grayColor];
}
}
图片黑白化
+ (UIImage *)changeColoursImageTograyScaleImage:(UIImage *)anImage type:(int)type {
CGImageRef imageRef = anImage.CGImage;
size_t width = CGImageGetWidth(imageRef);
size_t height = CGImageGetHeight(imageRef);
size_t bitsPerComponent = CGImageGetBitsPerComponent(imageRef);
size_t bitsPerPixel = CGImageGetBitsPerPixel(imageRef);
size_t bytesPerRow = CGImageGetBytesPerRow(imageRef);
CGColorSpaceRef colorSpace = CGImageGetColorSpace(imageRef);
CGBitmapInfo bitMapInfo = CGImageGetBitmapInfo(imageRef);
bool shouldInterPolate = CGImageGetShouldInterpolate(imageRef);
CGColorRenderingIntent intent = CGImageGetRenderingIntent(imageRef);
CGDataProviderRef dataProvider = CGImageGetDataProvider(imageRef);
CFDataRef data = CGDataProviderCopyData(dataProvider);
UInt8 *buffer = (UInt8 *)CFDataGetBytePtr(data);
NSInteger x,y;
for (y = 0; y < height; y++) {
for (x = 0; x < width; x++) {
UInt8 *tmp;
tmp = buffer + y * bytesPerRow + x * 4;
UInt8 red,green,blue;
red = *(tmp + 0);
green = *(tmp + 1);
blue = *(tmp + 2);
UInt8 brightness;
switch (type) {
case 0:
brightness = (77 * red + 28 * green + 151 * blue) / 256;
*(tmp + 0) = brightness;
*(tmp + 1) = brightness;
*(tmp + 1) = brightness;
break;
case 1:
brightness = (77 * red + 28 * green + 151 * blue) / 256;
*(tmp + 0) = red;
*(tmp + 1) = green * 0.7;
*(tmp + 1) = blue *0.4;
break;
case 2:
brightness = (77 * red + 28 * green + 151 * blue) / 256;
*(tmp + 0) = 255 - red;
*(tmp + 1) = 255 - green;
*(tmp + 1) = 255 - blue;
break;
default:
*(tmp + 0) = red;
*(tmp + 1) = green;
*(tmp + 2) = blue;
break;
}
}
}
CFDataRef effectedData = CFDataCreate(NULL, buffer, CFDataGetLength(data));
CGDataProviderRef effectedDataProvider = CGDataProviderCreateWithCFData(effectedData);
CGImageRef effectedCGImage = CGImageCreate(width, height, bitsPerComponent, bitsPerPixel, bytesPerRow, colorSpace, bitMapInfo, effectedDataProvider, NULL, shouldInterPolate, intent);
UIImage *effectedImage = [[UIImage alloc]initWithCGImage:effectedCGImage];
CGImageRelease(effectedCGImage);
CFRelease(effectedDataProvider);
CFRelease(effectedData);
CFRelease(data);
return effectedImage;
}
获取PNG图片大小
+ (CGSize)getPNGImageSizeWithRequest:(NSMutableURLRequest*)request {
[request setValue:@"bytes=16-23" forHTTPHeaderField:@"Range"];
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
if(data.length == 8) {
int w1 = 0, w2 = 0, w3 = 0, w4 = 0;
[data getBytes:&w1 range:NSMakeRange(0, 1)];
[data getBytes:&w2 range:NSMakeRange(1, 1)];
[data getBytes:&w3 range:NSMakeRange(2, 1)];
[data getBytes:&w4 range:NSMakeRange(3, 1)];
int w = (w1 << 24) + (w2 << 16) + (w3 << 8) + w4;
int h1 = 0, h2 = 0, h3 = 0, h4 = 0;
[data getBytes:&h1 range:NSMakeRange(4, 1)];
[data getBytes:&h2 range:NSMakeRange(5, 1)];
[data getBytes:&h3 range:NSMakeRange(6, 1)];
[data getBytes:&h4 range:NSMakeRange(7, 1)];
int h = (h1 << 24) + (h2 << 16) + (h3 << 8) + h4;
return CGSizeMake(w, h);
}
return CGSizeZero;
}
获取gif图片大小
+ (CGSize)getGIFImageSizeWithRequest:(NSMutableURLRequest*)request {
[request setValue:@"bytes=6-9" forHTTPHeaderField:@"Range"];
NSData* data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
if(data.length == 4) {
short w1 = 0, w2 = 0;
[data getBytes:&w1 range:NSMakeRange(0, 1)];
[data getBytes:&w2 range:NSMakeRange(1, 1)];
short w = w1 + (w2 << 8);
short h1 = 0, h2 = 0;
[data getBytes:&h1 range:NSMakeRange(2, 1)];
[data getBytes:&h2 range:NSMakeRange(3, 1)];
short h = h1 + (h2 << 8);
return CGSizeMake(w, h);
}
return CGSizeZero;
}
获取jpg图片大小
+ (CGSize)getJPGImageSizeWithRequest:(NSMutableURLRequest*)request {
[request setValue:@"bytes=0-209" forHTTPHeaderField:@"Range"];
NSData* data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
if ([data length] <= 0x58) {
return CGSizeZero;
}
if ([data length] < 210) {
short w1 = 0, w2 = 0;
[data getBytes:&w1 range:NSMakeRange(0x60, 0x1)];
[data getBytes:&w2 range:NSMakeRange(0x61, 0x1)];
short w = (w1 << 8) + w2;
short h1 = 0, h2 = 0;
[data getBytes:&h1 range:NSMakeRange(0x5e, 0x1)];
[data getBytes:&h2 range:NSMakeRange(0x5f, 0x1)];
short h = (h1 << 8) + h2;
return CGSizeMake(w, h);
} else {
short word = 0x0;
[data getBytes:&word range:NSMakeRange(0x15, 0x1)];
if (word == 0xdb) {
[data getBytes:&word range:NSMakeRange(0x5a, 0x1)];
if (word == 0xdb) {
short w1 = 0, w2 = 0;
[data getBytes:&w1 range:NSMakeRange(0xa5, 0x1)];
[data getBytes:&w2 range:NSMakeRange(0xa6, 0x1)];
short w = (w1 << 8) + w2;
short h1 = 0, h2 = 0;
[data getBytes:&h1 range:NSMakeRange(0xa3, 0x1)];
[data getBytes:&h2 range:NSMakeRange(0xa4, 0x1)];
short h = (h1 << 8) + h2;
return CGSizeMake(w, h);
} else {
short w1 = 0, w2 = 0;
[data getBytes:&w1 range:NSMakeRange(0x60, 0x1)];
[data getBytes:&w2 range:NSMakeRange(0x61, 0x1)];
short w = (w1 << 8) + w2;
short h1 = 0, h2 = 0;
[data getBytes:&h1 range:NSMakeRange(0x5e, 0x1)];
[data getBytes:&h2 range:NSMakeRange(0x5f, 0x1)];
short h = (h1 << 8) + h2;
return CGSizeMake(w, h);
}
} else {
return CGSizeZero;
}
}
}
图片调色
- (UIImage *)setRGBImage:(UIImage *)image R:(CGFloat)rk g:(CGFloat)gk b:(CGFloat)bk {
CGImageRef imageRef = image.CGImage;
NSUInteger width = CGImageGetWidth(imageRef);
NSUInteger height = CGImageGetWidth(imageRef);
CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();
UInt32 *imagePiexl = (UInt32 *)calloc(width*height, sizeof(UInt32));
CGContextRef contextRef = CGBitmapContextCreate(imagePiexl, width, height, 8, 4*width, colorSpaceRef, kCGImageAlphaNoneSkipLast);
CGContextDrawImage(contextRef, CGRectMake(0, 0, width, height), imageRef);
for (int y=0; y<height; y++) {
for (int x=0; x<width; x++) {
uint8_t *rgbPiexl = (uint8_t *)&imagePiexl[y*width+x];
if (rgbPiexl[0]>245&&rgbPiexl[1]>245&&rgbPiexl[2]>245) {
} else {
rgbPiexl[0] = rgbPiexl[0]*rk;
rgbPiexl[1] = rgbPiexl[1]*gk;
rgbPiexl[2] = rgbPiexl[2]*bk;
}
}
}
CGImageRef finalRef = CGBitmapContextCreateImage(contextRef);
CGContextRelease(contextRef);
CGColorSpaceRelease(colorSpaceRef);
free(imagePiexl);
return [UIImage imageWithCGImage:finalRef scale:image.scale orientation:UIImageOrientationUp];
}