Search code examples
cocoaresizensoutlineviewnsimagenstextfieldcell

Resize NSImage in custom NSTextFieldCell


I created drag and drop app using Apple's example: https://developer.apple.com/library/mac/samplecode/SourceView/Introduction/Intro.html

I load actual image of dragged file.

When I drag for example this enter image description here image file into my NSOutlineView, I see that it resized in this way:

enter image description here

I used as is without any modifications Apple's ImageAndTextCell class for custom NSTextFieldCell.

How I can resize this image to fit proportionally cell rect?


Solution

  • Works perfect.

    @implementation NSImage (ProportionalScaling)
    
    - (NSImage*)imageByScalingProportionallyToSize:(NSSize)targetSize
    {
      NSImage* sourceImage = self;
      NSImage* newImage = nil;
    
      if ([sourceImage isValid])
      {
        NSSize imageSize = [sourceImage size];
        float width  = imageSize.width;
        float height = imageSize.height;
    
        float targetWidth  = targetSize.width;
        float targetHeight = targetSize.height;
    
        float scaleFactor  = 0.0;
        float scaledWidth  = targetWidth;
        float scaledHeight = targetHeight;
    
        NSPoint thumbnailPoint = NSZeroPoint;
    
        if ( NSEqualSizes( imageSize, targetSize ) == NO )
        {
    
          float widthFactor  = targetWidth / width;
          float heightFactor = targetHeight / height;
    
          if ( widthFactor < heightFactor )
            scaleFactor = widthFactor;
          else
            scaleFactor = heightFactor;
    
          scaledWidth  = width  * scaleFactor;
          scaledHeight = height * scaleFactor;
    
          if ( widthFactor < heightFactor )
            thumbnailPoint.y = (targetHeight - scaledHeight) * 0.5;
    
          else if ( widthFactor > heightFactor )
            thumbnailPoint.x = (targetWidth - scaledWidth) * 0.5;
        }
    
        newImage = [[NSImage alloc] initWithSize:targetSize];
    
        [newImage lockFocus];
    
          NSRect thumbnailRect;
          thumbnailRect.origin = thumbnailPoint;
          thumbnailRect.size.width = scaledWidth;
          thumbnailRect.size.height = scaledHeight;
    
          [sourceImage drawInRect: thumbnailRect
                         fromRect: NSZeroRect
                        operation: NSCompositeSourceOver
                         fraction: 1.0];
    
        [newImage unlockFocus];
    
      }
    
      return [newImage autorelease];
    }
    
    @end