【问题标题】:Scale Up NSImage and Save放大 NSImage 并保存
【发布时间】:2013-03-23 13:49:57
【问题描述】:

我想将 64 像素的图像放大到 512 像素(即使它是模糊的或像素化的)

我正在使用它从我的 NSImageView 获取图像并保存它:

NSData *customimageData = [[customIcon image] TIFFRepresentation];
    NSBitmapImageRep *customimageRep = [NSBitmapImageRep imageRepWithData:customimageData];


    customimageData = [customimageRep representationUsingType:NSPNGFileType properties:nil];



    NSString* customBundlePath = [[NSBundle mainBundle] pathForResource:@"customIcon" ofType:@"png"];
    [customimageData writeToFile:customBundlePath atomically:YES];

我试过 setSize: 但它仍然保存 64px。

提前致谢!

【问题讨论】:

    标签: objective-c macos nsimage nsimageview nsbitmapimagerep


    【解决方案1】:

    您不能使用 NSImage 的 size 属性,因为它仅与图像表示的像素尺寸有间接关系。调整像素尺寸的一个好方法是使用NSImageRepdrawInRect方法:

     - (BOOL)drawInRect:(NSRect)rect
    

    在指定的矩形中绘制整个图像,并根据需要对其进行缩放以适合。

    这是一个图像调整大小的方法(以您想要的像素大小创建一个新的 NSImage)。

    - (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; 
    }
    

    来自我在这里给出的更详细的答案:NSImage doesn't scale

    另一种有效的调整大小方法是 NSImage 方法drawInRect:fromRect:operation:fraction:respectFlipped:hints

    - (void)drawInRect:(NSRect)dstSpacePortionRect 
              fromRect:(NSRect)srcSpacePortionRect 
             operation:(NSCompositingOperation)op 
              fraction:(CGFloat)requestedAlpha 
        respectFlipped:(BOOL)respectContextIsFlipped 
                 hints:(NSDictionary *)hints
    

    此方法的主要优点是hints NSDictionary,您可以在其中对插值进行一些控制。放大图像时,这可能会产生截然不同的结果。 NSImageHintInterpolation 是一个可以取五个值之一的枚举……

        enum {
           NSImageInterpolationDefault = 0,
           NSImageInterpolationNone = 1,
           NSImageInterpolationLow = 2,
           NSImageInterpolationMedium = 4,
           NSImageInterpolationHigh = 3
        };
        typedef NSUInteger NSImageInterpolation;
    

    使用这种方法不需要提取imageRep的中间步骤,NSImage会做正确的事情......

    - (NSImage*) resizeImage:(NSImage*)sourceImage size:(NSSize)size
    {
        NSRect targetFrame = NSMakeRect(0, 0, size.width, size.height);
        NSImage*  targetImage = [[NSImage alloc] initWithSize:size];
    
        [targetImage lockFocus];
    
        [sourceImage drawInRect:targetFrame
                       fromRect:NSZeroRect       //portion of source image to draw 
                      operation:NSCompositeCopy  //compositing operation
                       fraction:1.0              //alpha (transparency) value
                 respectFlipped:YES              //coordinate system
                          hints:@{NSImageHintInterpolation:
         [NSNumber numberWithInt:NSImageInterpolationLow]}];
    
        [targetImage unlockFocus];
    
        return targetImage;
    }
    

    【讨论】:

    • 谢谢,这正是我所需要的!
    • 这个答案对我来说是金子。 :) 非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-03
    • 2012-09-23
    • 1970-01-01
    • 2011-03-26
    相关资源
    最近更新 更多