iOS之实现图片的压缩、解压缩、模糊、置灰、马赛克、黑白化、调色等处理
生活随笔
收集整理的這篇文章主要介紹了
iOS之实现图片的压缩、解压缩、模糊、置灰、马赛克、黑白化、调色等处理
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
壓縮圖片
func imageCompress(targetWidth:CGFloat) -> UIImage {let targetHeight = (targetWidth/width)*heightUIGraphicsBeginImageContext(CGSize(width: targetWidth, height: targetHeight))self.draw(in: CGRect(x: 0, y: 0, width: targetWidth, height: targetHeight))let newImage : UIImage = UIGraphicsGetImageFromCurrentImageContext()!UIGraphicsEndImageContext()return newImage}圖片強(qiáng)制解壓縮
// 圖片處理-強(qiáng)制解壓縮操作-把元數(shù)據(jù)繪制到當(dāng)前的上下文-壓縮圖片 - (UIImage*)imageDetail:(UIImage *)image {// 獲取當(dāng)前圖片數(shù)據(jù)源CGImageRef imageRef = image.CGImage;// 設(shè)置大小改變壓縮圖片NSUInteger width = CGImageGetWidth(imageRef)/3;NSUInteger height = CGImageGetHeight(imageRef)/3;// 創(chuàng)建顏色空間CGColorSpaceRef colorSpace = CGImageGetColorSpace(imageRef);/*創(chuàng)建繪制當(dāng)前圖片的上下文CGBitmapContextCreate(void * __nullable data,size_t width, size_t height, size_t bitsPerComponent, size_t bytesPerRow,CGColorSpaceRef cg_nullable space, uint32_t bitmapInfo)data:所需要的內(nèi)存空間 傳nil會(huì)自動(dòng)分配width/height:當(dāng)前畫(huà)布的大小bitsPerComponent:每個(gè)顏色分量的大小 RGBA 每一個(gè)分量占1個(gè)字節(jié)bytesPerRow:每一行使用的字節(jié)數(shù) 4*widthbitmapInfo:RGBA繪制的順序*/CGContextRef contextRef =CGBitmapContextCreate(nil,width,height,8,4*width,colorSpace,kCGImageAlphaNoneSkipLast);// 根據(jù)數(shù)據(jù)源在上下文(畫(huà)板)繪制圖片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}圖片設(shè)置馬賽克
- 馬賽克就是讓圖片看上去模糊不清。將特定區(qū)域的像素點(diǎn)設(shè)置為同一種顏色,整體就會(huì)變得模糊,區(qū)域塊越大越模糊,越小越接近于原始像素。
- 同樣使用強(qiáng)制解壓縮操作,操作像素點(diǎn),馬賽克部分:
① 設(shè)置區(qū)域大小;
② 在該區(qū)域獲取一個(gè)像素點(diǎn)(第一個(gè))作為整個(gè)區(qū)域的取色;
③ 將取色設(shè)置到區(qū)域中;
④ 取下一個(gè)區(qū)域同上去色設(shè)置區(qū)域。
- C庫(kù)函數(shù) - memcpy():
圖片置灰
- 給imageView加灰色圖片
- image的渲染置灰: imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];這個(gè)方法,是給當(dāng)前的image做一個(gè)渲染效果,后面的參數(shù)是一個(gè)枚舉,這個(gè)template代表始終使用前景色tintcolor來(lái)渲染,接著設(shè)置tintcolor,imageview的背景色不會(huì)變灰,可以正常設(shè)置,而顯示的圖片是灰色;
圖片黑白化
+ (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) {// 肯定只有一個(gè)DQT字段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) {// 兩個(gè)DQT字段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 { // 一個(gè)DQT字段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;}} }圖片調(diào)色
// 調(diào)色 - (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);// 創(chuàng)建顏色空間CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();// 根據(jù)像素點(diǎn)個(gè)數(shù)創(chuàng)建一個(gè)所需要的空間UInt32 *imagePiexl = (UInt32 *)calloc(width*height, sizeof(UInt32));CGContextRef contextRef = CGBitmapContextCreate(imagePiexl, width, height, 8, 4*width, colorSpaceRef, kCGImageAlphaNoneSkipLast);// 根據(jù)圖片數(shù)據(jù)源繪制上下文CGContextDrawImage(contextRef, CGRectMake(0, 0, width, height), imageRef);// 將彩色圖片像素點(diǎn)重新設(shè)置顏色// 取平均值 R=G=B=(R+G+B)/3for (int y=0; y<height; y++) {for (int x=0; x<width; x++) {// 操作像素點(diǎn)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;} }}// 根據(jù)上下文繪制CGImageRef finalRef = CGBitmapContextCreateImage(contextRef);// 釋放用過(guò)的內(nèi)存CGContextRelease(contextRef);CGColorSpaceRelease(colorSpaceRef);free(imagePiexl);return [UIImage imageWithCGImage:finalRef scale:image.scale orientation:UIImageOrientationUp]; }總結(jié)
以上是生活随笔為你收集整理的iOS之实现图片的压缩、解压缩、模糊、置灰、马赛克、黑白化、调色等处理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Swift之数组去重(去除重复元素)
- 下一篇: Swift之UIView设置部分圆角与获