Alterar a origem dos limites + cortar uma imagem
-
28-10-2019 - |
Pergunta
Sou um novato no Cocoa, tenho algumas dúvidas em relação ao NSImage.
<✓Questão1:
Alterar a origem dos limites de uma imagem não parece ter nenhum efeito.Eu esperava que a imagem fosse desenhada a partir da origem recém-definida, mas não parece ser o caso.Estou perdendo alguma coisa?
NSImage* carImage = [NSImage imageNamed:@"car"];
[self.imageView setImage:carImage];
//Following line has no effect:
self.imageView.bounds = CGRectMake(self.imageView.bounds.origin.x + 100, self.imageView.bounds.origin.y, self.imageView.bounds.size.width,self.imageView.bounds.size.height);
Observação : imageView é um IBOutlet
<✓Questão2:
Eu estava tentando cortar uma imagem, mas não parece estar cortando a imagem, posso ver a imagem completa.O que é que estou perdendo?
NSRect sourceRect = CGRectMake(150, 25, 100, 50);
NSRect destRect = CGRectMake(0, 0, 100, 50);
NSImage* carImage = [NSImage imageNamed:@"car"];
[carImage drawInRect:destRect fromRect:sourceRect operation:NSCompositeSourceOver fraction:1.0];
[self.imageView setImage:carImage];
Obrigado
Solução
Alterar a origem dos limites de uma imagem não parece ter nenhum efeito. …
//Following line has no effect: self.imageView.bounds = CGRectMake(self.imageView.bounds.origin.x + 100, self.imageView.bounds.origin.y, self.imageView.bounds.size.width,self.imageView.bounds.size.height);
Isso é uma visualização de imagem, não uma imagem.
O efeito de alterar os limites de uma visualização depende do que a visualização faz para desenhar. Efetivamente, isso significa que você não deve alterar os limites de uma visualização que não é uma instância de uma classe de visualização que você criou, uma vez que você não pode prever exatamente como um NSImageView desenhará sua imagem (presumivelmente, já que é um controle, envolve sua célula, mas mais do que isso, eu não confiaria).
De modo mais geral, é muito raro alterar a origem dos limites de uma visualização. Não me lembro de ter feito isso, e não consigo pensar em uma razão de início para fazer isso. Alterar o tamanho de seus limites aumentará, não cortará.
Eu estava tentando cortar uma imagem, mas não parece estar cortando a imagem, posso ver a imagem completa. O que é que estou perdendo?
[carImage drawInRect:destRect fromRect:sourceRect operation:NSCompositeSourceOver fraction:1.0]; [self.imageView setImage:carImage];
Dizer a uma imagem para desenhar não muda nada em relação à imagem. Ele não “cortará a imagem” de forma que a imagem fique menor ou maior. Você está dizendo para desenhar, nada mais.
Consequentemente, a declaração seguinte define a imagem da visualização da imagem para a imagem inteira, exatamente como se você não tivesse dito para a imagem desenhar, porque dizer para ela desenhar não faz diferença.
O que dizer a uma imagem para desenhar faz exatamente isso: diz à imagem para desenhar. Existem apenas dois lugares corretos para fazer isso:
- Entre as mensagens
lockFocus
eunlockFocus
para uma visualização ou imagem (ou depois de definir o NSGraphicsContext atual). - No método
drawRect:
de uma visualização.
Em qualquer outro lugar, você não deve dizer a nenhum objeto Cocoa para desenhar.
Uma maneira correta de cortar uma imagem é criar uma nova imagem com o tamanho desejado / ajustado, travar o foco nela, desenhar a parte desejada da imagem original nela e destravar o foco na nova imagem. Você terá então a versão original e uma recortada.
Outra maneira correta seria criar sua própria visualização de imagem personalizada com duas propriedades: uma possuindo uma imagem para desenhar e a outra segurando um retângulo. Quando instruído a desenhar, esta visualização personalizada dirá à imagem para desenhar o retângulo dado dentro dos limites da visualização. Você sempre manteria a imagem original e simplesmente desenharia apenas a seção desejada.