Pregunta

Estoy tratando de utilizar la función de selección y copia del IKImageView. Si todo lo que quiere hacer es tener una aplicación con una imagen, seleccionar una parte y copiarlo en el portapapeles, es fácil. Se establece la selección de menú copia de la copia del primer nivel de respuesta:. Método y (id) mágicamente todo funciona

Sin embargo, si quieres algo más complicado, al igual que desea copiar como parte de alguna otra operación, me parece que no puede encontrar el método para hacer esto.

IKImageView no parecen tener un método de copia, no parecen tener un método que incluso le dirá el rectángulo seleccionado!

Me han pasado por el libro Hillegass', por lo que entiendo cómo funciona el portapapeles, pero no cómo conseguir la parte de la imagen de la vista ...

Ahora, estoy empezando a pensar que he cometido un error al basar mi proyecto en IKImageView, pero es lo que Vista previa se basa en (o por lo que he leído), así que pensé que tenía que ser estable ... y de todos modos, ahora es demasiado tarde, estoy demasiado profundo en esto para empezar de nuevo ...

Así que, aparte de no usar IKImageView, alguna sugerencia sobre cómo copiar la región de selección en el portapapeles de forma manual?

Editar en realidad, he encontrado el método de copia (id), pero cuando lo llamo, me

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

Lo que obviamente no sucede cuando hago una copia normal a través de la primera respuesta ... entiendo el mensaje de error, pero no estoy seguro de que se está haciendo desde estos parámetros ...

¿Hay alguna manera de rastrear a través de este y ver cómo esto está sucediendo? Un depurador no ayudará, por razones obvias, así como el hecho de que estoy haciendo esto en Mozilla, por lo que un depurador no es una opción de todos modos ...

EDIT 2 Se me ocurre que la copia:. (Id) método que encontré se puede copiar el VISTA en lugar de copiar un trozo de la imagen en el portapapeles, que es lo que necesito

La razón por la que pensé que era la copia del portapapeles es que en otro proyecto, donde yo estoy copiando desde un IKImageView en el portapapeles directamente desde el menú de edición, sólo se envía una copia: (id) a la firstResponder, pero no soy realmente seguro de lo que el firstresponder hace con ella ...

Datos 3 Parece ser que el error proviene de CGBitmapContextCreate [imageView image] la que, curiosamente, es un método documentado.

Es posible que esto está sucediendo porque estoy poniendo la imagen de allí con un setImage: Método (id), pasándole un NSImage * ... ¿Hay alguna otra manera, más inteligente de conseguir una NSImage en un IKImageView ?

¿Fue útil?

Solución

El método -copy: en IKImageView hace lo mismo que todos los demás métodos -copy:: copia la selección actual en el portapapeles. Es, sin embargo, implementado como un método privado en IKImageView por alguna razón.

Sólo puede llamar directamente:

[imageView copy:nil];

Esto copiará lo que esté seleccionado actualmente en el portapapeles.

No creo que hay una manera para acceder directamente al contenido de la imagen de la selección actual en IKImageView utilizando métodos públicos, esto es un candidato bueno para un / solicitud de función informe de error.

Puede, sin embargo, utilizar el método -selectionRect privada para obtener una CGRect de la selección actual y usarlo para extraer la parte seleccionada de la imagen:

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

Otros consejos

Ok, por lo que la copia: cero falla, y la [imagen imageView] falla, pero resulta que tengo otra copia de la NSImage desde cuando he añadido en la vista, en primer lugar, por lo que pude eso. Además, CGImageCreateWithImageInRect espera no es un CGImageRef un NSImage *, por lo que tenía que hacer algunas conversiones.

Además, por alguna razón, se da la vuelta el rectángulo de selección, ya sea que la parte inferior origined, y la imagen es superior, o al revés, así que tuve que darle la vuelta.

Y por alguna razón, el compilador de repente comenzó a quejarse de que NSRect no es del mismo tipo que CGRect (lo que implica que de repente pasó de 32 a 64 bits o algo ... no sé por qué ...)

De todos modos, aquí está mi copia 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;

}

Me escribió flipCGRect, y [currentImage doc] devuelve un NSImage * ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top