Pergunta

Estou tentando usar o recurso Selecionar e Copiar do IkimageView. Se tudo o que você deseja fazer é ter um aplicativo com uma imagem, selecione uma parte e copie -a para a área de transferência, é fácil. Você define a escolha do menu de cópia para o método da cópia: (ID) do primeiro respondedor e magicamente tudo funciona.

No entanto, se você quer algo mais complicado, como deseja copiar como parte de alguma outra operação, não consigo encontrar o método para fazer isso.

O ikimageView não parece ter um método de cópia, ele não parece ter um método que até lhe dirá o retângulo selecionado!

Eu passei pelo livro de Hillegass, então entendo como a área de transferência funciona, mas não como tirar a parte da imagem da vista ...

Agora, estou começando a pensar que cometi um erro ao basear meu projeto no ikimageview, mas é sobre o que a prévia é construída (ou assim eu li), então achei que tinha que ser estável ... e de qualquer maneira, Agora é tarde demais, estou muito profundo nisso para começar de novo ...

Então, além de não usar o ikimageView, alguma sugestão sobre como copiar a região selecionada para a área de transferência manualmente?

EDITAR Na verdade, eu encontrei o método de cópia (id), mas quando eu chamo, eu entendo

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

O que obviamente não acontece quando faço uma cópia normal através do primeiro-resposta ... eu entendo a mensagem de erro, mas não tenho certeza de onde está obtendo esses parâmetros ...

Existe alguma maneira de rastrear isso e ver como isso está acontecendo? Um depurador não ajudará por razões óbvias, assim como o fato de estar fazendo isso em Mozilla, então um depurador não é uma opção de qualquer maneira ...

Editar 2 Ocorre -me que a cópia: (id) Método que encontrei pode estar copiando a visualização em vez de copiar um pedaço da imagem para a área de transferência, que é o que eu preciso.

A razão pela qual eu pensei que era a cópia da área de transferência é que, em outro projeto, onde estou copiando de um ikimageview para a prancha direta do menu Editar, ele apenas envia uma cópia: (id) para o Firstronder, mas não sou Na verdade, tenho certeza do que o Firstroponder faz com ele ...

Editar 3 Parece que o erro CGBITMapContextCreate vem de [imageView image] o que, por incrível que seja, É um método documentado.

É possível que isso esteja acontecendo porque estou colocando a imagem lá com um método setImage: (id), passando um nsimage*... Existe outra maneira mais inteligente de colocar um nsimage em um ikimageView?

Foi útil?

Solução

o -copy: método em IKImageView faz o que todos os outros -copy: Método: copia a seleção atual para a área de transferência. É, no entanto, implementado como um método privado em IKImageView por algum motivo.

Você pode simplesmente chamá -lo diretamente:

[imageView copy:nil];

Isso copiará o que for selecionado atualmente para a área de transferência.

Eu não acho que existe uma maneira de acessar diretamente o conteúdo da imagem da seleção atual em IKImageView Usando métodos públicos, este é um bom candidato para um relatório de bug/solicitação de recurso.

Você pode, no entanto, usar o método privado -selectionRect para obter um CGRect da seleção atual e use isso para extrair a parte selecionada da imagem:

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

Outras dicas

OK, então a cópia: nil falha e a [imagem ImageView] falha, mas acontece que eu tenho outra cópia do NSImage de quando a adicionei na vista em primeiro lugar, para que eu pudesse. Além disso, o CGIMAGECREATEWITHIMAGEIRCT espera um CGIMAGEREF não um nsimage*, então eu tive que fazer algumas conversões.

Além disso, por algum motivo, o retângulo de seleção é invertido, é originário de fundo e a imagem é superior, ou o contrário, então tive que virar.

E, por algum motivo, o compilador de repente começou a reclamar que o NSrect não é o mesmo tipo que o CGrect (o que implica que de repente passou de 32 para 64 bits ou algo assim ... não sei por que ...)

Enfim, aqui está minha cópia do 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;

}

Eu escrevi FlipcGrect e [Doc CurrentImage] retorna um nsimage*...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top