压缩图片

 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}

图片强制解压缩

// 图片处理-强制解压缩操作-把元数据绘制到当前的上下文-压缩图片
- (UIImage*)imageDetail:(UIImage *)image {// 获取当前图片数据源CGImageRef imageRef = image.CGImage;// 设置大小改变压缩图片NSUInteger width = CGImageGetWidth(imageRef)/3;NSUInteger height = CGImageGetHeight(imageRef)/3;// 创建颜色空间CGColorSpaceRef colorSpace = CGImageGetColorSpace(imageRef);/*创建绘制当前图片的上下文CGBitmapContextCreate(void * __nullable data,size_t width, size_t height, size_t bitsPerComponent, size_t bytesPerRow,CGColorSpaceRef cg_nullable space, uint32_t bitmapInfo)data:所需要的内存空间 传nil会自动分配width/height:当前画布的大小bitsPerComponent:每个颜色分量的大小 RGBA 每一个分量占1个字节bytesPerRow:每一行使用的字节数 4*widthbitmapInfo:RGBA绘制的顺序*/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];
}
  • C库函数 - memcpy():
 /** 参数1:指向用于存储复制内容的目标数组;* 参数2:指向要复制的数据源;* 参数3:要复制的字节数*/memcpy(void *__dst, const void *__src, size_t __n);

图片置灰

  • 给imageView加灰色图片
 + (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) {// 肯定只有一个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) {// 两个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 { // 一个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;}}
}

图片调色

// 调色
- (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);// 将彩色图片像素点重新设置颜色// 取平均值 R=G=B=(R+G+B)/3for (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];
}

iOS之实现图片的压缩、解压缩、模糊、置灰、马赛克、黑白化、调色等处理相关推荐

  1. iOS自带图片大小压缩

    iOS自带的图片压缩方式有两个方法: UIImageJPEGRepresentation: UIImagePNGRepresentation: 在开发中个人用的比较多的方式是UIImageJPEGRe ...

  2. iOS优秀的图片压缩处理方案

    大家好,好久没有更新博客了.一个早9晚5点半的硬是上成了996.悲剧的加班狗! 背景: 最近遇到一个图片压缩的问题,项目需求压缩图片500k以内上传服务器,还要求图片要清晰一点.还有证明是图片500k ...

  3. 数据结构编程实践(七)创建哈夫曼树、生成哈夫曼编码、完成图片的压缩与解压缩

    一.对图片的压缩与解压缩,涉及以下内容: 1.文件读写 2.创建Huffman树 3.生成Huffman编码 4.压缩图片文件 5 .  解压缩图片文件 二.将项目分成三个小任务,下一任务是在上一任务 ...

  4. 如何压缩jpg图片的大小,快速压缩不模糊

    如何压缩jpg图片的大小,快速压缩不模糊呢?因为无论工作还是生活,我们现在接触到的图片的机会非常的频繁.尤其是现在智能手机的普及,我们为了记录生活,会拍摄非常多的照片.当我们的照片日积月累之后,我们对 ...

  5. ios 上传图片失败 小程序_小程序图片自动压缩配置

    问题 在我现在负责的小程序中,每次ui变更都需要引入新的图片,为了控制小程序体积,都需要先把图片压缩了再放到项目中,但是每次都要手动压缩一次,太麻烦了.所以我想能否在项目加入图片的时候,自动的对加入的 ...

  6. 如何压缩照片不失真?图片压缩不模糊的方法

    经常拍照的小伙伴们应该都知道,现在的数码设备的像素越来越高,所以拍摄出来的照片也就越来越大,一般照片都在几M到十几M之间,这些图片虽然非常清楚,但是同样的也非常占空间,平时在使用或者发送.上传的时候非 ...

  7. 【Android 内存优化】Android 工程中使用 libjpeg-turbo 压缩图片 ( 初始化压缩对象 | 打开文件 | 设置压缩参数 | 写入压缩图像数据 | 完成压缩 | 释放资源 )

    文章目录 一.使用 libjpeg-turbo 压缩图片流程 二.初始化 JPEG 压缩对象 三.打开文件 四.设置压缩参数 五.开始压缩 六.循环写入压缩数据 七.完成图片压缩及收尾 八.libjp ...

  8. 【Android 内存优化】图片文件压缩 ( Android 原生 API 提供的图片压缩功能能 | 图片质量压缩 | 图片尺寸压缩 )

    文章目录 一. 图片压缩 二. 图片文件压缩类型 三. Android 原生 API 提供的质量压缩 四. Android 原生 API 提供的尺寸压缩 一. 图片压缩 图片压缩 : ① 文件压缩 : ...

  9. 移动前端—H5实现图片先压缩再上传

    在做移动端图片上传的时候,用户传的都是手机本地图片,而本地图片一般都相对比较大,拿iphone6来说,平时拍很多图片都是一两M的,如果直接这样上传,那图片就太大了,如果用户用的是移动流量,完全把图片上 ...

最新文章

  1. 鲲鹏高校行太原站来袭,两大课程一站式掌握未来潮流
  2. python 调试器之pdb
  3. java reduce.mdn_reduce高级用法
  4. 干货:计算机网络知识总结
  5. 一个使用 SAP Spartacus 开发的电商网站 - Lego 乐高
  6. caffe学习路的起点
  7. 将WORD文档中整篇文章的自动编号消除,但原序号不变
  8. 【leetcode】535. Encode and Decode TinyURL
  9. ubuntu12.04 + virtualbox
  10. 可以解压日文的软件_日文换成中文字体就不好看?我偏不信这个邪!
  11. Robot Framework操作
  12. 软件项目管理 需求管理
  13. openvswitch console输出
  14. SONET/SDH帧格式
  15. 入耳式无线蓝牙耳机哪款好?无线入耳蓝牙耳机推荐
  16. 给领导敬酒杯子非要低于领导吗?
  17. 夜神模拟器连接手柄无反应_夜神安卓模拟器怎么连接手柄 夜神模拟器连接手柄教程...
  18. 海康威视人脸识别智能终端获取设备事件二次开发Java
  19. | 应用打包还是测试团队老大难问题?
  20. [unity3d][通过代码]制作模型,动态生成模型,通过点画模型

热门文章

  1. 常见Linux面试题总结
  2. 常见坑人无数的Redis面试题总结
  3. ffmpeg文档29-放缩选项
  4. 2015 11月30日 一周工作计划与执行
  5. 举例什么时候会用到 call(), apply()
  6. ORM数据层框架的设计热点:更新指定的列的几种设计方案
  7. 将js文件打包进dll 方法3
  8. MVC 中用JS跳转窗体Window.Location.href
  9. 【数据结构】排序相关题目及各种排序方法的总结
  10. c语言写程序计算表达式的值,C语言 写的 表达式求值。