macOS 开发 - NSImge格式转换/压缩(CIImage/CGImageRef/NSData)


格式转换

需要导入头文件

 #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;

}

猜你喜欢

转载自blog.csdn.net/lovechris00/article/details/81103692