Question

I am a newbie to Cocoa, I have a few doubts regarding NSImage.

Question1:

Changing the bounds origin of an image doesn't seem to have any effect. I expected the image to be drawn from the newly set origin but that doesn't seem to the case. Am I missing something ?

code:

NSImage* carImage = [NSImage imageNamed:@"car"];

[self.imageView setImage:carImage];

//Following line has no effect:
self.imageView.bounds = CGRectMake(self.imageView.bounds.origin.x + 100, self.imageView.bounds.origin.y, self.imageView.bounds.size.width,self.imageView.bounds.size.height);

Note: imageView is an IBOutlet

Question2:

I was trying to crop an image, but it doesn't seem to be cropping the image, I can see the complete image. What is that I am missing ?

code:

NSRect sourceRect = CGRectMake(150, 25, 100, 50);
NSRect destRect = CGRectMake(0, 0, 100, 50);

NSImage* carImage = [NSImage imageNamed:@"car"];

[carImage drawInRect:destRect fromRect:sourceRect operation:NSCompositeSourceOver fraction:1.0];

[self.imageView setImage:carImage];

Thanks

Was it helpful?

Solution

Changing the bounds origin of an image doesn't seem to have any effect. …

//Following line has no effect:
self.imageView.bounds = CGRectMake(self.imageView.bounds.origin.x + 100, self.imageView.bounds.origin.y, self.imageView.bounds.size.width,self.imageView.bounds.size.height);

That's an image view, not an image.

The effect of changing the bounds of a view depends on what the view does to draw. Effectively, this means you shouldn't change the bounds of a view that isn't an instance of a view class you created, since you can't predict exactly how an NSImageView will draw its image (presumably, since it's a control, it involves its cell, but more than that, I wouldn't rely on).

More generally, it's pretty rare to change a view's bounds origin. I don't remember having ever done it, and I can't think of a reason off the top of my head to do it. Changing its bounds size will scale, not crop.

I was trying to crop an image, but it doesn't seem to be cropping the image, I can see the complete image. What is that I am missing ?

[carImage drawInRect:destRect fromRect:sourceRect operation:NSCompositeSourceOver fraction:1.0];

[self.imageView setImage:carImage];

Telling an image to draw does not change anything about the image. It will not “crop the image” such that the image will thereafter be smaller or larger. You are telling it to draw, nothing more.

Consequently, the statement after that sets the image view's image to the whole image, exactly as if you hadn't told the image to draw, because telling it to draw made no difference.

What telling an image to draw does is exactly that: It tells the image to draw. There are only two correct places to do that:

  1. In between lockFocus and unlockFocus messages to a view or image (or after setting the current NSGraphicsContext).
  2. Within a view's drawRect: method.

Anywhere else, you should not tell any Cocoa object to draw.

One correct way to crop an image is to create a new image of the desired/adjusted size, lock focus on it, draw the desired portion of the original image into it, and unlock focus on the new image. You will then have both the original and a cropped version.

Another correct way would be to create your own custom image view that has two properties: One owning an image to draw, and the other holding a rectangle. When told to draw, this custom view would tell the image to draw the given rectangle into the view's bounds. You would then always hold the original image and simply draw only the desired section.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top