【问题标题】:Change bounds origin + cropping an image更改边界原点 + 裁剪图像
【发布时间】:2012-01-16 02:35:25
【问题描述】:

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

谢谢

【问题讨论】:

    标签: macos cocoa nsimage nsimageview setbounds


    【解决方案1】:

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

    //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 对象进行绘制。

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

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

    【讨论】:

    • 非常感谢彼得,你的回答真的很有帮助!!
    猜你喜欢
    • 1970-01-01
    • 2018-10-24
    • 1970-01-01
    • 1970-01-01
    • 2019-01-31
    • 2021-08-12
    • 1970-01-01
    • 2011-06-22
    • 1970-01-01
    相关资源
    最近更新 更多