日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2024/5/21 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 iOS之实现图片的压缩、解压缩、模糊、置灰、马赛克、黑白化、调色等处理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

壓縮圖片

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之实现图片的压缩、解压缩、模糊、置灰、马赛克、黑白化、调色等处理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。