更改边界原点+裁剪图像

时间:2012-01-16 02:35:25

标签: macos cocoa nsimage nsimageview setbounds

我是Cocoa的新手,我对NSImage有些怀疑。

问题1:

更改图像的边界原点似乎没有任何效果。我希望图像是从新设置的原点绘制的,但似乎并非如此。我错过了什么吗?

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

注意:imageView是一个IBOutlet

问题2:

我正在尝试裁剪图像,但它似乎没有裁剪图像,我可以看到完整的图像。我错过了什么?

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

由于

1 个答案:

答案 0 :(得分:2)

  

更改图像的边界原点似乎没有任何效果。 ...

//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);

这是图像视图,而不是图像。

更改视图边界的效果取决于视图绘制的内容。实际上,这意味着您不应该更改不是您创建的视图类实例的视图的边界,因为您无法准确预测NSImageView将如何绘制其图像(可能,因为它是一个控件,它涉及它的细胞,但更重要的是,我不会依赖它。

更一般地说,更改视图的边界来源非常罕见。我不记得曾经做过这件事,而且我无法想到这样做的原因。更改其边界大小将缩放,而不是裁剪。

  

我正在尝试裁剪图像,但它似乎没有裁剪图像,我可以看到完整的图像。我错过了什么?

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

[self.imageView setImage:carImage];

告诉要绘制的图像不会改变图像的任何内容。它不会“裁剪图像”,使得图像此后将更小或更大。你告诉它画画,仅此而已。

因此,之后的陈述将图像视图的图像设置为整个图像,就像您没有告诉图像绘制一样,因为告诉它绘制没有任何区别。

告诉要绘制的图像的确是这样:它告诉图像绘制。只有两个正确的地方可以做到:

  1. 在视图或图片的lockFocusunlockFocus消息之间(或在设置当前的NSGraphicsContext之后)。
  2. 在视图的drawRect:方法中。
  3. 在任何其他地方,你不应该告诉任何Cocoa对象。

    裁剪图像的一种正确方法是创建所需/调整大小的新图像,锁定焦点,将原始图像的所需部分绘制到其中,然后将焦点解锁到新图像上。然后,您将拥有原始版本和裁剪版本。

    另一种正确的方法是创建自己的自定义图像视图,它具有两个属性:一个拥有要绘制的图像,另一个拥有一个矩形。当被告知要绘制时,这个自定义视图会告诉图像将给定的矩形绘制到视图的边界中。然后,您将始终保留原始图像,只绘制所需的部分。