更改边界原点+裁剪图像



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

感谢

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

//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:方法中

在其他任何地方,都不应该告诉任何Cocoa对象要绘制。

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

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

相关内容

  • 没有找到相关文章

最新更新