0

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

ありがとう

4

1 に答える 1

2

画像の境界原点を変更しても効果がないようです。…</p>

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

それは画像ではなく、画像ビューです。

ビューの境界を変更する効果は、ビューが何を描画するかによって異なります。これは事実上、作成したビュー クラスのインスタンスではないビューの境界を変更してはならないことを意味します。その細胞を巻き込みますが、それ以上には頼りません)。

より一般的には、ビューの境界の起点を変更することはほとんどありません。私はそれをやった覚えがありませんし、頭のてっぺんからそうする理由が思い浮かびません。境界のサイズを変更すると、トリミングではなくスケーリングされます。

画像をトリミングしようとしましたが、画像をトリミングしていないようで、完全な画像が表示されます。私が見逃しているのは何ですか?

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

[self.imageView setImage:carImage];

画像に描画を指示しても、画像は何も変わりません。その後、画像が小さくなったり大きくなったりするような「画像のトリミング」は行われません。あなたはそれを描くように言っています、それ以上は何もありません。

したがって、その後のステートメントは、画像に描画するように指示しても違いがないため、画像に描画するように指示しなかった場合とまったく同じように、画像ビューの画像を画像全体に設定します。

画像に描画するように指示することは、まさにそれです。画像に描画するように指示します。それを行う正しい場所は 2 つだけです。

  1. lockFocusビューまたは画像へのメッセージの間unlockFocus(または現在の NSGraphicsContext を設定した後)。
  2. ビューのdrawRect:メソッド内。

それ以外の場合は、Cocoa オブジェクトに描画するように指示しないでください。

画像をトリミングする正しい方法の 1 つは、目的のサイズまたは調整されたサイズの新しい画像を作成し、その画像にフォーカスをロックし、元の画像の目的の部分をその中に描画し、新しい画像のフォーカスを解除することです。これで、元のバージョンとトリミングされたバージョンの両方が得られます。

別の正しい方法は、2 つのプロパティを持つ独自のカスタム イメージ ビューを作成することです。1 つは描画するイメージを所有し、もう 1 つは四角形を保持します。描画するように指示されると、このカスタム ビューは、指定された四角形をビューの境界に描画するように画像に指示します。その後、元の画像を常に保持し、必要なセクションのみを描画します。

于 2012-01-16T04:49:06.250 に答える