文章目录
- 格式转换
- CGImageRef转NSImage
- NSImage转CGImageRef
- NSImage转CIImage
- NSView 转 NSImage
- 格式 jpg&png
- 尺寸
- 压缩
- 将图片按照比例压缩
- 将图片压缩到指定大小(KB)
- demos
- 修改图片尺寸并保存
- 1、将指定路径图片,按照比例压缩,并保存
- 2、组合图片
格式转换
需要导入头文件
#import <QuartzCore/CIFilter.h>
CGImageRef转NSImage
#pragma mark - CGImageRef转NSImage
- (NSImage *)getNSImageWithCGImageRef:(CGImageRef)imageRef{NSRect imageRect = NSMakeRect(0.0, 0.0, 0.0, 0.0);CGContextRef imageContext = nil;NSImage* newImage = nil;imageRect.size.height = CGImageGetHeight(imageRef);imageRect.size.width = CGImageGetWidth(imageRef);// Create a new image to receive the Quartz image data.newImage = [[NSImage alloc] initWithSize:imageRect.size];[newImage lockFocus];// Get the Quartz context and draw.imageContext = (CGContextRef)[[NSGraphicsContext currentContext]graphicsPort];CGContextDrawImage(imageContext, *(CGRect*)&imageRect, imageRef);[newImage unlockFocus];return newImage;}
NSImage转CGImageRef
#pragma mark - NSImage转CGImageRef
- (CGImageRef)getCGImageRefWithNSImage:(NSImage *)image{NSData * imageData = [image TIFFRepresentation];CGImageRef imageRef = nil;if(imageData){CGImageSourceRef imageSource =CGImageSourceCreateWithData((CFDataRef)imageData, NULL);imageRef = CGImageSourceCreateImageAtIndex(imageSource, 0, NULL);}return imageRef;
}
NSImage转CIImage
#pragma mark - NSImage转CIImage
- (void)getCIImageWithNSImage:(NSImage *)myImage{// convert NSImage to bitmap
// NSImage * myImage = [self currentImage];NSData * tiffData = [myImage TIFFRepresentation];NSBitmapImageRep * bitmap;bitmap = [NSBitmapImageRep imageRepWithData:tiffData];// create CIImage from bitmapCIImage * ciImage = [[CIImage alloc] initWithBitmapImageRep:bitmap];// create affine transform to flip CIImageNSAffineTransform *affineTransform = [NSAffineTransform transform];[affineTransform translateXBy:0 yBy:128];[affineTransform scaleXBy:1 yBy:-1];// create CIFilter with embedded affine transformCIFilter *transform = [CIFilter filterWithName:@"CIAffineTransform"];[transform setValue:ciImage forKey:@"inputImage"];[transform setValue:affineTransform forKey:@"inputTransform"];// get the new CIImage, flipped and ready to serveCIImage * result = [transform valueForKey:@"outputImage"];// draw to view[result drawAtPoint: NSMakePoint ( 0,0 )fromRect: NSMakeRect ( 0,0,128,128 )operation: NSCompositeSourceOverfraction: 1.0];// cleanup
// [ciImage release];
}
NSView 转 NSImage
#pragma mark - NSView 转 NSImage
- (void)getNSImageWithNSView:(NSView *)zwView{[zwView lockFocus];//zwView为继承NSView类的一个对象NSImage *image = [[NSImage alloc] initWithData:[zwView dataWithPDFInsideRect:[zwView bounds]]];[zwView unlockFocus];[image lockFocus];//先设置 下面一个实例NSBitmapImageRep *bits = [[NSBitmapImageRep alloc]initWithFocusedViewRect:[zwView frame]];[image unlockFocus];//再设置后面要用到得 props属性NSDictionary *imageProps = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:0] forKey:NSImageCompressionFactor];//之后 转化为NSData 以便存到文件中NSData *imageData = [bits representationUsingType:NSPNGFileType properties:imageProps];//设定好文件路径后进行存储就ok了[imageData writeToFile:[[[NSString alloc] initWithFormat:@"~/Documents/test%d.jpg",1] stringByExpandingTildeInPath]atomically:YES]; //保存的文件路径一定要是绝对路径,相对路径不行
}
格式 jpg&png
保存图片为png
#pragma mark - 保存图片为png
- (void)saveImage:(NSImage *)img asPngToPath:(NSString *)path{NSData *imageData = [img TIFFRepresentation];NSBitmapImageRep *imageRep = [NSBitmapImageRep imageRepWithData:imageData];// [imageRep setSize:NSMakeSize(50, 50)]; //没用?//pngNSData *imgData0 = [imageRep representationUsingType:NSPNGFileType properties:nil];[imgData0 writeToFile:path atomically:YES];}
保存图片为jpg
注意,保存到本地的话,需要关闭沙盒。
#pragma mark - 保存图片为jpg- (void)saveImage:(NSImage *)img asjpgToPath:(NSString *)path{NSData *imageData = [img TIFFRepresentation];NSBitmapImageRep *imageRep = [NSBitmapImageRep imageRepWithData:imageData];[imageRep setSize:NSMakeSize(50, 50)]; //没用?//pngNSData *imgData0 = [imageRep representationUsingType:NSPNGFileType properties:nil];NSData *imageData1 = [imageRep representationUsingType:NSJPEGFileType properties:nil];[imageData1 writeToFile:path atomically:YES];}
#pragma mark - 保存图片到本地
/*NSJPEGFileTypeNSPNGFileType*/
+ (void)saveImage:(NSImage *)imgasType:(NSBitmapImageFileType)storageTypetoPath:(NSString *)path{NSData *imageData = [img TIFFRepresentation];NSBitmapImageRep *imageRep = [NSBitmapImageRep imageRepWithData:imageData];NSData *imageData1 = [imageRep representationUsingType:storageType properties:nil];[imageData1 writeToFile:path atomically:YES];
}
尺寸
修改图片尺寸
#pragma mark - 修改图片尺寸
- (NSImage *)resizeImage:(NSImage*)sourceImagesize:(NSSize)size
{NSRect targetFrame = NSMakeRect(0, 0, size.width, size.height);NSImage* targetImage = nil;NSImageRep *sourceImageRep =[sourceImage bestRepresentationForRect:targetFramecontext:nilhints:nil];targetImage = [[NSImage alloc] initWithSize:size];[targetImage lockFocus];[sourceImageRep drawInRect: targetFrame];[targetImage unlockFocus];return targetImage;
}
压缩
将图片按照比例压缩
#pragma mark - 将图片按照比例压缩
//rate 压缩比0.1~1.0之间
- (NSData *)getCompressImageDataWithImg:(NSImage *)imgrate:(CGFloat)rate{NSData *imgDt = [img TIFFRepresentation];if (!imgDt) {return nil;}NSBitmapImageRep *imageRep = [NSBitmapImageRep imageRepWithData:imgDt];NSDictionary *imageProps = [NSDictionary dictionaryWithObject:[NSNumber numberWithFloat:rate] forKey:NSImageCompressionFactor];imgDt = [imageRep representationUsingType:NSJPEGFileType properties:imageProps];return imgDt;}
将图片压缩到指定大小(KB)
#pragma mark - 将图片压缩到指定大小(KB)
- (NSData *)getCompressImgData:(NSData *)imgDatatoAimKB:(NSInteger)aimKB
{if (!imgData) {return nil;}NSData *data = [self getCompressImgDataWithData:imgData rate:0.8];CGFloat m = 0.1;CGFloat n = 1.0;while ((unsigned long)data.length > aimKB*1024) {n = n - m;//压缩前unsigned long datalenght = data.length;//压缩后data = [self getCompressImgDataWithData:imgData rate:n];if (datalenght==data.length) {NSLog(@"无法继续压缩 - 数据大小:%lu , 压缩比率:%f",(unsigned long)data.length/1024,n);break;}NSLog(@"数据大小:%lu , 压缩比率:%f",(unsigned long)data.length/1024,n);}NSLog(@"数据最终大小:%lu",(unsigned long)data.length/1024);return data;
}#pragma mark - 将图片按照比例压缩
//rate 压缩比0.1~1.0之间
- (NSData *)getCompressImgDataWithData:(NSData *)imgDatarate:(CGFloat)rate{if (!imgData) {return nil;}NSBitmapImageRep *imageRep = [NSBitmapImageRep imageRepWithData:imgData];NSDictionary *imageProps = [NSDictionary dictionaryWithObject:[NSNumber numberWithFloat:rate] forKey:NSImageCompressionFactor];imgData = [imageRep representationUsingType:NSJPEGFileType properties:imageProps];return imgData;}
demos
修改图片尺寸并保存
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {self.imgPath = @"/Users/administrator/Desktop/cat.jpg";NSImage *img = [[NSImage alloc]initWithContentsOfFile:self.imgPath];NSImage *resizeImg = [self resizeImage:img size:NSMakeSize(30, 30)];[self saveImage:resizeImg asjpgToPath:@"/Users/administrator/Desktop/cat_r.jpg"];
}#pragma mark - 修改图片尺寸
- (NSImage *)resizeImage:(NSImage*)sourceImagesize:(NSSize)size
{NSRect targetFrame = NSMakeRect(0, 0, size.width, size.height);NSImage* targetImage = nil;NSImageRep *sourceImageRep =[sourceImage bestRepresentationForRect:targetFramecontext:nilhints:nil];targetImage = [[NSImage alloc] initWithSize:size];[targetImage lockFocus];[sourceImageRep drawInRect: targetFrame];[targetImage unlockFocus];return targetImage;
}
1、将指定路径图片,按照比例压缩,并保存
#pragma mark - 将图片按照比例压缩
//rate 压缩比0.1~1.0之间
- (NSData *)getCompressImage:(NSImage *)imgrate:(CGFloat)rateoutPath:(NSString *)outPath{NSData *imgDt = [img TIFFRepresentation];if (!imgDt) {return nil;}NSBitmapImageRep *imageRep = [NSBitmapImageRep imageRepWithData:imgDt];NSDictionary *imageProps = [NSDictionary dictionaryWithObject:[NSNumber numberWithFloat:rate] forKey:NSImageCompressionFactor];imgDt = [imageRep representationUsingType:NSJPEGFileType properties:imageProps];int ret = [imgDt writeToFile:outPath atomically:YES];if (ret>0) {NSLog(@"success - outPath : %@ , rate : %f,%ld",outPath,rate,imgDt.length);}else{printf("FAILURE!\n");}return imgDt;
}- (void)compressImage{NSString *imgPath = @"/Users/administrator/Desktop/cat.jpg";NSString *imgPath1 = @"/Users/administrator/Desktop/cat1.jpg";NSString *imgPath2 = @"/Users/administrator/Desktop/cat2.jpg";NSImage *img = [[NSImage alloc]initWithContentsOfFile:imgPath];[self getCompressImage:img rate:0.1 outPath:imgPath1];[self getCompressImage:img rate:0.5 outPath:imgPath2];}
2、组合图片
- (void)jointImage{ NSMutableArray *imgArray = [NSMutableArray array];for (int i = 1; i < 6; i++) {NSString *imgPath = [NSString stringWithFormat:@"/Users/administrator/Desktop/图片/%d.jpg",i];NSImage *img = [[NSImage alloc]initWithContentsOfFile:imgPath];[imgArray addObject:img];}[self jointImage:imgArray];}- (NSImage *)jointImage:(NSArray *)imgArray{CGFloat imgW = 0;CGFloat imgH = 0;for (NSImage *img in imgArray) {if (img) {imgW += img.size.width;if (imgH < img.size.height) {imgH = img.size.height;}}}NSLog(@"size : %@",NSStringFromSize(NSMakeSize(imgW, imgH)));NSImage *togetherImg = [[NSImage alloc]initWithSize:NSMakeSize(imgW, imgH)];[togetherImg lockFocus];CGContextRef imgContext = (CGContextRef)[[NSGraphicsContext currentContext] graphicsPort];CGFloat imgX = 0;for (NSImage *img in imgArray) {CGImageRef imageRef = [self getCGImageRefFromNSImage:img];CGContextDrawImage(imgContext, NSMakeRect(imgX, 0, img.size.width, img.size.height), imageRef);imgX += img.size.width;NSLog(@"rect : %@",NSStringFromRect(NSMakeRect(imgX, 0, img.size.width, img.size.height)));}[togetherImg unlockFocus];return togetherImg;}
伊织 2018-07-17