格式转换
需要导入头文件
#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 bitmap
CIImage * ciImage = [[CIImage alloc] initWithBitmapImageRep:bitmap];
// create affine transform to flip CIImage
NSAffineTransform *affineTransform = [NSAffineTransform transform];
[affineTransform translateXBy:0 yBy:128];
[affineTransform scaleXBy:1 yBy:-1];
// create CIFilter with embedded affine transform
CIFilter *transform = [CIFilter filterWithName:@"CIAffineTransform"];
[transform setValue:ciImage forKey:@"inputImage"];
[transform setValue:affineTransform forKey:@"inputTransform"];
// get the new CIImage, flipped and ready to serve
CIImage * result = [transform valueForKey:@"outputImage"];
// draw to view
[result drawAtPoint: NSMakePoint ( 0,0 )
fromRect: NSMakeRect ( 0,0,128,128 )
operation: NSCompositeSourceOver
fraction: 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)]; //没用?
//png
NSData *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)]; //没用?
//png
NSData *imgData0 = [imageRep representationUsingType:NSPNGFileType properties:nil];
NSData *imageData1 = [imageRep representationUsingType:NSJPEGFileType properties:nil];
[imageData1 writeToFile:path atomically:YES];
}
#pragma mark - 保存图片到本地
/*
NSJPEGFileType
NSPNGFileType
*/
+ (void)saveImage:(NSImage *)img
asType:(NSBitmapImageFileType)storageType
toPath:(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*)sourceImage
size:(NSSize)size
{
NSRect targetFrame = NSMakeRect(0, 0, size.width, size.height);
NSImage* targetImage = nil;
NSImageRep *sourceImageRep =
[sourceImage bestRepresentationForRect:targetFrame
context:nil
hints: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 *)img
rate:(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 *)imgData
toAimKB:(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 *)imgData
rate:(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*)sourceImage
size:(NSSize)size
{
NSRect targetFrame = NSMakeRect(0, 0, size.width, size.height);
NSImage* targetImage = nil;
NSImageRep *sourceImageRep =
[sourceImage bestRepresentationForRect:targetFrame
context:nil
hints: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 *)img
rate:(CGFloat)rate
outPath:(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;
}