Question

Je suis en train d'utiliser la sélection et la copie de la fonction IKImageView. Si tout ce que vous voulez faire est d'avoir une application avec une image, sélectionnez une partie et le copier dans le presse-papiers, il est facile. Vous définissez le choix du menu de copie à la copie du premier intervenant: méthode (id) et comme par magie tout fonctionne

.

Cependant, si vous voulez quelque chose de plus compliqué, comme vous voulez copier dans le cadre d'une autre opération, je ne peux pas sembler trouver la méthode pour le faire.

IKImageView ne semble pas avoir une méthode de copie, il ne semble pas avoir une méthode qui va même vous dire le rectangle sélectionné!

Je suis passé par le livre de Hillegass, donc je comprends comment fonctionne le presse-papiers, tout simplement pas comment la partie de l'image de la vue ...

Maintenant, je commence à penser que je fait une erreur en fondant mon projet sur IKImageView, mais il est ce que Aperçu est construit (ou alors je l'ai lu), donc je me suis dit qu'il devait être stable ... et de toute façon, il est maintenant trop tard, je suis trop profondément dans ce recommencer ...

, autre que de ne pas utiliser IKImageView, des suggestions sur la façon de copier la région sélectionnez le presse-papiers manuellement?

EDIT en fait, je l'ai trouvé la méthode de copie (id), mais quand je l'appelle, je reçois

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

Ce qui ne se produit pas évidemment quand je fais une copie normale dans le premier répondeur ... Je comprends le message d'erreur, mais je ne sais pas où il est d'obtenir ces paramètres de ...

Est-il possible de tracer à travers cela et voir comment cela se passe? Un débogueur ne sera pas utile pour des raisons évidentes, ainsi que le fait que je fais cela dans Mozilla, si un débogueur est pas une option quand même ...

EDIT 2 Il me semble que la copie. Méthode (id) J'ai trouvé peut être copier la vue plutôt que la copie d'un morceau de l'image dans le presse-papiers, qui est ce que j'ai besoin

La raison pour laquelle je pensais que c'était la copie du presse-papiers est que dans un autre projet, où je copie d'un IKImageView le presse-papiers directement à partir du menu d'édition, il envoie juste une copie: (id) au firstResponder, mais je « ne suis pas vraiment sûr de ce que l'firstresponder fait avec elle ...

EDIT 3 Il semble que l'erreur CGBitmapContextCreate vient [imageView image] qui, assez curieusement, une méthode documentée.

Il est possible que cela se passe parce que je suis en train de l'image là-bas avec un setImage: (id) méthode, il passe un NSImage * ... Y at-il un autre, de façon plus intelligente d'obtenir un NSImage dans un IKImageView ?

Était-ce utile?

La solution

La méthode -copy: dans IKImageView fait ce que toutes les autres méthodes de -copy: fait: il copie la sélection courante dans le presse-papiers. Il est, cependant, mis en œuvre en tant que méthode privée dans IKImageView pour une raison quelconque.

Vous pouvez simplement appeler directement:

[imageView copy:nil];

Cette copie tout ce qui est sélectionné dans le presse papier.

Je ne pense pas qu'il y ait un moyen d'accéder directement au contenu de l'image de la sélection actuelle dans IKImageView en utilisant des méthodes publiques, c'est un bon candidat pour un rapport de bogue / demande de fonctionnalité.

Vous pouvez cependant utiliser la méthode privée -selectionRect pour obtenir un CGRect de la sélection et l'utiliser pour extraire la partie sélectionnée de l'image:

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

Autres conseils

Ok, donc la copie: nul échoue, et [imageView image] échoue, mais il se trouve que j'ai une autre copie du NSImage du moment où je l'ai ajouté dans la vue en premier lieu, pour que je puisse cela. En outre, CGImageCreateWithImageInRect attend un CGImageRef pas NSImage *, donc je devais faire des conversions.

En outre, pour une raison quelconque le rectangle de sélection est basculée, soit il est en bas origined, et l'image est supérieure, ou l'inverse, je devais donc pour la retourner.

Et pour une raison quelconque, le compilateur a soudainement commencé à se plaindre que NSRect n'est pas le même type que CGRect (ce qui implique qu'il est soudainement allé de 32 à 64 bits ou quelque chose ... ne sais pas pourquoi ...)

Quoi qu'il en soit, voici ma copie de 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;

}

J'ai écrit flipCGRect et [doc currentImage] retourne un NSImage * ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top