1

IKImageView の選択およびコピー機能を使用しようとしています。画像付きのアプリがあれば、その一部を選択してクリップボードにコピーするのは簡単です。コピー メニュー ピックをファーストレスポンダの copy:(id) メソッドに設定すると、魔法のようにすべてが機能します。

ただし、他の操作の一部としてコピーするなど、より複雑なものが必要な場合は、これを行う方法が見つからないようです。

IKImageView には copy メソッドがないようです。選択された四角形を教えてくれるメソッドもないようです!

Hillegass の本を読んだので、画像の一部をビューから取り出す方法ではなく、クリップボードの仕組みを理解しています...

今、私は自分のプロジェクトを IKImageView に基づいて作成するのを間違えたと思い始めていますが、Preview が構築されている (または私が読んだ) ものなので、安定している必要があると考えました...そしてとにかく、もう手遅れです、やり直すには深すぎます...

IKImageView を使用しない以外に、選択した領域を手動でクリップボードにコピーする方法について何か提案はありますか?

EDIT実際には、copy(id) メソッドを見つけましたが、それを呼び出すと、

 <Error>: CGBitmapContextCreate: unsupported parameter combination: 8 integer bits/component; 16 bits/pixel; 1-component color space; kCGImageAlphaPremultipliedLast; 2624 bytes/row.

ファーストレスポンダーを介して通常のコピーを実行すると、明らかに発生しません...エラーメッセージは理解できますが、それらのパラメーターがどこから取得されているのかわかりません...

これを追跡して、これがどのように起こっているかを確認する方法はありますか? デバッガーは明らかな理由で役に立たないだけでなく、私がこれを Mozilla で行っているという事実もあるため、とにかくデバッガーはオプションではありません...

EDIT 2私が見つけたcopy:(id)メソッドは、画像のチャンクをクリップボードにコピーするのではなく、VIEWをコピーしている可能性があります。これが必要です。

クリップボードのコピーだと思った理由は、編集メニューから直接 IKImageView からクリップボードにコピーしている別のプロジェクトで、copy:(id) を firstResponder に送信するだけだからです。実際、ファーストレスポンダーがそれで何をするかを確認してください...

EDIT 3 CGBitmapContextCreate エラーは[imageView image]奇妙なことに、文書化されたメソッドから発生しているようです。

setImage:(id) メソッドを使用してそこに画像を配置し、NSImage* を渡しているため、これが発生している可能性があります... NSImage を IKImageView に取得する他のより賢い方法はありますか?

4

2 に答える 2

0

-copy:メソッドは、IKImageView他のすべての-copy:メソッドが実行することを実行します。現在の選択範囲をクリップボードにコピーします。ただし、IKImageView何らかの理由でプライベートメソッドとして実装されています。

直接呼び出すことができます:

[imageView copy:nil];

これにより、現在選択されているものがすべてクリップボードにコピーされます。

パブリックメソッドを使用して現在の選択の画像コンテンツに直接アクセスする方法はないと思いますIKImageView。これはバグレポート/機能リクエストの良い候補です。

ただし、privateメソッド-selectionRectを使用して現在の選択を取得し、CGRectそれを使用して画像の選択された部分を抽出することができます。

//stop the compiler from complaining when we call a private method
@interface IKImageView (CompilerSTFU)
- (CGRect)selectionRect
@end

@implementation YourController
//imageView is an IBOutlet connected to your IKImageView
- (NSImage*)selectedImage
{
    //get the current selection
    CGRect selection = [imageView selectionRect];

    //get the portion of the image that the selection defines
    CGImageRef selectedImage = CGImageCreateWithImageInRect([imageView image],(CGRect)selection);

    //convert it to an NSBitmapImageRep
    NSBitmapImageRep* bitmap = [[[NSBitmapImageRep alloc] initWithCGImage:selectedImage] autorelease];
    CGImageRelease(selectedImage);

    //create an image from the bitmap data
    NSImage* image = [[[NSImage alloc] initWithData:[bitmap TIFFRepresentation]] autorelease];

    //in 10.6 you can skip converting to an NSBitmapImageRep by doing this:
    //NSImage* image = [[NSImage alloc] initWithCGImage:selectedImage size:NSZeroSize];     
    return image;
}
@end
于 2010-03-25T01:45:30.650 に答える
0

OK、copy: nil は失敗し、[imageView image] は失敗しますが、最初にビューに追加したときから NSImage の別のコピーがあることがわかりました。また、CGImageCreateWithImageInRect は NSImage* ではなく CGImageRef を想定しているため、いくつかの変換を行う必要がありました。

さらに、何らかの理由で、選択長方形が反転していて、元が下で、画像が上であるか、またはその逆であるため、反転する必要がありました。

そして、何らかの理由で、コンパイラは突然、NSRect が CGRect と同じタイプではないという不平を言い始めました (これは、突然 32 ビットから 64 ビットか何かになったことを意味します...理由はわかりません...)

とにかく、ここにselectedImageの私のコピーがあります:

- (NSImage*)selectedImage
{
    //get the current selection
    CGRect selection = flipCGRect(imageView, [imageView selectionRect]);

    //get the portion of the image that the selection defines
    struct CGImage * full = [[doc currentImage] CGImageForProposedRect: NULL context: NULL hints: NULL];

    CGImageRef selectedImage = CGImageCreateWithImageInRect( full, selection);


    //convert it to an NSBitmapImageRep
    NSBitmapImageRep* bitmap = [[[NSBitmapImageRep alloc] initWithCGImage:selectedImage] autorelease];
    CGImageRelease(selectedImage);

//     //create an image from the bitmap data
    NSImage* image = [[[NSImage alloc] initWithData:[bitmap TIFFRepresentation]] autorelease];

//     //in 10.6 you can skip converting to an NSBitmapImageRep by doing this:
    //NSImage* image = [[NSImage alloc] initWithCGImage:selectedImage size:NSZeroSize];     
    return image;

}

私は FlipCGRect を書き、[doc currentImage] は NSImage* を返します...

于 2010-03-25T22:33:30.473 に答える