How to resize NSImage?

前端 未结 10 1682
萌比男神i
萌比男神i 2020-12-02 21:21

I have an NSBitmapImageRep which is WxH size.

I create NSImage and call addRepresentation:. Then I n

10条回答
  •  醉酒成梦
    2020-12-02 21:27

    For just scaling NSBitmapImageRep

    static NSBitmapImageRep *i_scale_bitmap(const NSBitmapImageRep *bitmap, const uint32_t width, const uint32_t height)
    {
        NSBitmapImageRep *new_bitmap = NULL;
        CGImageRef dest_image = NULL;
        CGColorSpaceRef space = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB);
        CGContextRef context = CGBitmapContextCreate(NULL, (size_t)width, (size_t)height, PARAM(bitsPerComponent, 8), PARAM(bytesPerRow, (size_t)(width * 4)), space, kCGImageAlphaPremultipliedLast);
        CGImageRef src_image = [bitmap CGImage];
        CGRect rect = CGRectMake((CGFloat)0.f, (CGFloat)0.f, (CGFloat)width, (CGFloat)height);
        CGContextDrawImage(context, rect, src_image);
        dest_image = CGBitmapContextCreateImage(context);
        CGContextRelease(context);
        CGColorSpaceRelease(space);
        new_bitmap = [[NSBitmapImageRep alloc] initWithCGImage:dest_image];
        CGImageRelease(dest_image);
        return new_bitmap;
    }
    

    And for scaling a NSImage based on NSBitmapImageRep

    ImageImp *imgimp_create_scaled(const ImageImp *image, const uint32_t new_width, const uint32_t new_height)
    {
        NSImage *src_image = (NSImage*)image;
        NSBitmapImageRep *src_bitmap, *dest_bitmap;
        NSImage *scaled_image = nil;
        cassert_no_null(src_image);
        cassert([[src_image representations] count] == 1);
        cassert([[[src_image representations] objectAtIndex:0] isKindOfClass:[NSBitmapImageRep class]]);
        src_bitmap = (NSBitmapImageRep*)[[(NSImage*)image representations] objectAtIndex:0];
        cassert_no_null(src_bitmap);
        dest_bitmap = i_scale_bitmap(src_bitmap, new_width, new_height);
        scaled_image = [[NSImage alloc] initWithSize:NSMakeSize((CGFloat)new_width, (CGFloat)new_height)];
        [scaled_image addRepresentation:dest_bitmap];
        cassert([scaled_image retainCount] == 1);
        [dest_bitmap release];
        return (ImageImp*)scaled_image;
    }
    

    Draw directly over NSImage ([NSImage lockFocus], etc) will create a NSCGImageSnapshotRep not a NSBitmapImageRep.

提交回复
热议问题