Frage

Ich versuche, die Auswahl und Kopierfunktion des IKImageView zu verwenden. Wenn alles, was Sie tun möchten, ist eine App mit einem Bild hat, einen Teil auswählen und kopiert ihn in die Zwischenablage, ist es einfach. Sie legen die Kopie Menü Pick der ersten Responder-Kopie. (Id) Methode und auf magische Weise alles funktioniert

Wenn Sie jedoch etwas mehr kompliziert wollen, wie Sie als Teil eines anderen Vorgangs kopieren wollen, kann ich nicht, dies zu tun scheinen, um die Methode zu finden.

IKImageView scheint nicht eine Kopie Methode zu haben, scheint es nicht, ein Verfahren zu haben, die auch Sie sagen, das ausgewählte Rechteck!

Ich habe durch Hillegass Buch weg, so dass ich, wie die Zwischenablage Werke verstehe, nur nicht, wie man den Teil des Bildes, um aus der Sicht ...

Nun, ich fange an zu glauben, dass ich einen Fehler in stützt mein Projekt auf IKImageView gemacht, aber es ist das, was Vorschau auf gebaut ist (oder so habe ich gelesen), so dass ich dachte, es stabil sein musste ... und wie auch immer, jetzt ist es zu spät, ich bin zu tief in dem von vorne anfangen ...

Also, anders als nicht IKImageView verwenden, irgendwelche Vorschläge, wie die Auswahl Region in die Zwischenablage manuell kopieren?

Bearbeiten tatsächlich, ich habe die Kopie (id) Methode gefunden, aber wenn ich es nennen, ich

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

Was offensichtlich nicht der Fall sein, wenn ich eine normale Kopie durch den First-Responder tun ... verstehe ich die Fehlermeldung, aber ich bin mir nicht sicher, wo es diese Parameter immer aus ...

Gibt es eine Möglichkeit, durch diese zu verfolgen und sehen, wie dies geschieht? Ein Debugger wird nicht helfen, aus offensichtlichen Gründen, aber auch die Tatsache, dass ich dies in Mozilla mache, so ein Debugger sowieso keine Option ...

EDIT 2 Es fällt mir, dass die Kopie. (Id) Methode, die ich gefunden kann die VIEW werden kopiert, anstatt das Kopieren ein Stück des Bildes in die Zwischenablage, das ist das, was ich brauche

Der Grund, warum ich dachte, es war die Zwischenablage zu kopieren, dass in einem anderen Projekt, wo ich von einem IKImageView in die Zwischenablage direkt aus dem Menü Bearbeiten Kopieren, sendet er nur eine Kopie: (id) an die firstResponder, aber ich ‚m nicht wirklich sicher, was die firstresponder daraus macht ...

EDIT 3 Es scheint, dass der CGBitmapContextCreate Fehler von [imageView image] kommt, die, seltsam genug, IS ein dokumentiertes Verfahren.

Es ist möglich, dass dies geschieht, weil ich das Bild dort bin setzen mit einem setImage: (id) Methode, übergeben Sie einen NSImage * ... Gibt es eine andere, kluge Weise eine NSImage in eine IKImageView des Erhaltens ?

War es hilfreich?

Lösung

Die -copy: Methode in IKImageView tut, was jede andere -copy: Methode macht: Es kopiert die aktuelle Auswahl in die Zwischenablage. Es wird jedoch als private Methode in IKImageView aus irgendeinem Grund durchgeführt.

Sie können es einfach direkt anrufen:

[imageView copy:nil];

Dies wird kopiert, was zur Zeit in die Zwischenablage ausgewählt ist.

Ich glaube nicht, dass es eine Möglichkeit, direkt auf den Bildinhalt der aktuellen Auswahl in IKImageView Zugang mit öffentlichen Methoden, dies ist ein guter Kandidat für einen Fehlerbericht / Feature-Anfrage.

Sie können jedoch verwenden, um die private Methode -selectionRect eine CGRect der aktuellen Auswahl zu erhalten und verwenden Sie den ausgewählten Teil des Bildes zu extrahieren:

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

Andere Tipps

Ok, also die Kopie: nil schlägt fehl, und die [Imageview Bild] ausfällt, aber es stellt sich heraus, dass ich eine weitere Kopie der NSImage haben aus, wenn ich es in die Ansicht in erster Linie hinzugefügt, so konnte ich das. Auch CGImageCreateWithImageInRect erwartet ein CGImageRef kein NSImage *, also musste ich einige Umwandlungen tun.

Darüber hinaus aus irgendeinem Grunde wird das Auswahlrechteck gekippt, entweder sein Boden origined, und das Bild ist oben, oder umgekehrt, so dass ich es leicht zu schlagen hatte.

Und aus irgendeinem Grund, der Compiler beschweren begann plötzlich, dass NSRect ist nicht die gleiche Art wie CGRect (was bedeutet, dass es plötzlich von 32 auf 64 Bit oder etwas ging ... nicht sicher, warum ...)

Wie auch immer, hier ist meine Kopie von 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;

}

Ich schrieb flipCGRect und [doc currentImage] liefert ein NSImage * ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top