Domanda

Sto cercando di utilizzare la selezione e caratteristica del IKImageView copiare. Se tutto quello che vogliamo fare è avere un app con un'immagine, selezionare una parte e copiarlo negli appunti, è facile. Si imposta il pick menu di copia per copiare il primo del rispondente: il metodo (id) e magicamente tutto funziona

.

Tuttavia, se volete qualcosa di più complicato, come si desidera copiare come parte di qualche altra operazione, non posso sembrare trovare il metodo per fare questo.

IKImageView non sembra avere un metodo di copia, non sembra avere un metodo che anche dirvi il rettangolo selezionata!

Ho passato con il libro Hillegass', così ho capire come funziona appunti, non solo come ottenere la porzione di immagine fuori della vista ...

Ora, sto iniziando a pensare che ho fatto un errore nel basare il mio progetto su IKImageView, ma è ciò che è costruito su Anteprima (o almeno così ho letto), così ho pensato che doveva essere stabile ... e in ogni caso, ora è troppo tardi, sono troppo in profondità in questo ricominciare ...

Quindi, diversi da quelli non utilizzare IKImageView, qualche suggerimento su come copiare la regione di selezione negli appunti manualmente?

Modifica in realtà, ho trovato il metodo copia (id), ma quando io lo chiamo, ho

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

Il che, ovviamente, non accade quando faccio una copia normale attraverso il primo-responder ... Capisco il messaggio di errore, ma non sono sicuro di dove si sta facendo quei parametri da ...

C'è un modo per tracciare attraverso questo e vedere come questo sta accadendo? Un debugger non aiuterà per ovvie ragioni, così come il fatto che io sto facendo questo in Mozilla, quindi un debugger non è un'opzione in ogni caso ...

Modifica 2 Mi viene da pensare che la copia:. (Id) metodo che ho trovato può essere copiando VIEW invece di copiare un pezzo dell'immagine negli appunti, che è quello che mi serve

La ragione per cui ho pensato che fosse la copia negli appunti è che in un altro progetto, dove sto copiando da un IKImageView negli appunti direttamente dal menu di modifica, li invia una copia: (id) al firstResponder, ma io 'm non proprio sicuro di quello che la firstResponder fa con esso ...

EDIT 3 Sembra che l'errore CGBitmapContextCreate proviene da [imageView image] che, stranamente, è un metodo documentato.

E 'possibile che questo sta accadendo perché sto mettendo l'immagine in là con un setImage: il metodo (id), passando come NSImage * ... C'è qualche altro modo più intelligente di ottenere un NSImage in un IKImageView ?

È stato utile?

Soluzione

Il metodo -copy: in IKImageView fa ciò che ogni altro metodo -copy: fa: esso copia la selezione corrente negli appunti. E ', tuttavia, implementato come un metodo privato in IKImageView per qualche motivo.

Si può chiamare direttamente:

[imageView copy:nil];

Questo copierà tutto ciò che è attualmente selezionata negli appunti.

Non credo ci sia un modo per accedere direttamente al contenuto dell'immagine della selezione corrente in IKImageView usando metodi pubblici, questo è un buon candidato per un / richiesta di bug report funzione.

È possibile, tuttavia, utilizzare il metodo -selectionRect privato per ottenere una CGRect della selezione corrente e l'uso che per estrarre la parte selezionata dell'immagine:

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

Altri suggerimenti

Ok, quindi la copia: nil fallisce, e il [immagine ImageView] fallisce, ma si scopre che ho un'altra copia del NSImage da quando ho aggiunto in vista, in primo luogo, così ho potuto che. Inoltre, si aspetta una CGImageCreateWithImageInRect non CGImageRef un NSImage *, così ho dovuto fare alcune conversioni.

Inoltre, per qualche motivo il rettangolo di selezione è capovolto, o è inferiore originato, e l'immagine è alto, o viceversa, così ho dovuto capovolgerla.

E per qualche ragione, il compilatore improvvisamente ha iniziato a lamentarsi che NSRect non è dello stesso tipo di CGRect (che non implica che improvvisamente è andato 32-64 bit o qualcosa del genere ... sicuro perché ...)

In ogni caso, qui è la mia copia di 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;

}

ho scritto flipCGRect, e [currentImage doc] restituisce un NSImage * ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top