No meu aplicativo para iPhone, tiro uma foto com a câmera e desejo redimensioná-la para 290 * 390 pixels. Eu estava usando esse método para redimensionar a imagem:
UIImage *newImage = [image _imageScaledToSize:CGSizeMake(290, 390)
interpolationQuality:1];
Funciona perfeitamente, mas é uma função não documentada, por isso não posso mais usá-la no iPhone OS4.
Então ... qual é a maneira mais simples de redimensionar uma UIImage?
Respostas:
A maneira mais simples é definir o quadro
UIImageView
e definircontentMode
uma das opções de redimensionamento.Ou você pode usar este método utilitário, se você realmente precisar redimensionar uma imagem:
Exemplo de uso:
fonte
newImage
já será liberado automaticamente e deve ser o método que chamou isso para mantê-lo ou não. Essa abordagem está apenas implorando por um erro de memória, poisinit
não faz parte do nome do método. Eu esperaria que um método nomeado como esse retornasse um objeto liberado automaticamente.UIGraphicsBeginImageContextWithOptions
Aqui está uma versão rápida da resposta de Paul Lynch
E como uma extensão:
fonte
Solução adequada do Swift 3.0 para iOS 10+ : uso
ImageRenderer
e sintaxe de fechamento:E aqui está a versão do Objective-C:
fonte
Trevor Howard tem algumas categorias UIImage que lidam com redimensionamento bastante bem. Se nada mais, você pode usar o código como exemplos.
Nota: No iOS 5.1, esta resposta pode ser inválida. Veja o comentário abaixo.
fonte
Uma versão mais compacta para Swift 4 e iOS 10+:
Uso:
fonte
Também vi isso feito (que eu uso nos
UIButtons
estados Normal e Selecionado, pois os botões nãoresize
se ajustam). O crédito vai para quem foi o autor original.Primeiro faça um arquivo .h e .m vazia chamada
UIImageResizing.h
eUIImageResizing.m
Inclua esse arquivo .h em qualquer arquivo .m no qual você usará a função e chame-a assim:
fonte
Essa melhoria no código de Paul fornecerá uma imagem nítida em alta resolução em um iPhone com uma tela retina. Caso contrário, ao reduzir, fica embaçado.
fonte
UIGraphicsBeginImageContextWithOptions
usará automaticamente a escala da tela principal (a partir do iOS 3.2).Aqui está uma maneira simples:
resizedImage é uma nova imagem.
fonte
Solução rápida para Stretch Fill, Aspect Fill e Aspect Fit
e para usar, você pode fazer o seguinte:
Agradecimentos a abdullahselek por sua solução original.
fonte
Aqui está uma modificação da categoria escrita por iWasRobbed acima. Ele mantém a proporção da imagem original em vez de distorcê-la.
fonte
Se você deseja apenas uma imagem menor e não se importa com o tamanho exato:
Definir escala para
0.25f
fornecer uma imagem de 816 por 612 a partir de uma câmera de 8MP.Aqui está uma categoria UIImage + Scale para quem precisa de um.
fonte
Por que tão complicado? Eu acho que o uso da API do sistema pode alcançar o mesmo resultado:
O único problema é que você deve passar a razão inversa da meta como segundo argumento, pois, de acordo com o documento, o segundo parâmetro especifica a proporção da imagem original em comparação com a nova escala.
fonte
Esta é uma extensão UIImage compatível com o Swift 3 e o Swift 4 que dimensiona a imagem para um determinado tamanho com uma proporção
Exemplo de uso
fonte
scaledImage(with size:)
ouscaledWithSize(_:)
. TambémUIGraphicsGetImageFromCurrentImageContext
não pode realmente retornarnil
, portanto,!
também funcionaria. Você também pode simplificar a criação correta paraCGRect(origin: .zero, size: size)
.Eu encontrei uma categoria para UIImage nos próprios exemplos da Apple, que faz o mesmo truque. Aqui está o link: https://developer.apple.com/library/ios/samplecode/sc2273/Listings/AirDropSample_UIImage_Resize_m.html .
Você só precisa alterar a chamada:
no
imageWithImage:scaledToSize:inRect:
com:Para considerar o canal alfa na imagem.
fonte
fonte
Para meus colegas xamarianos, aqui está uma versão Xamarin.iOS C # da resposta de @Paul Lynch.
fonte
Se você deseja criar uma miniatura de uma UIImage (com redimensionamento proporcional ou talvez algum corte envolvido), consulte a categoria UIImage + Resize que permite usar a sintaxe concisa semelhante ao ImageMagick:
fonte
[cf Chris] Para redimensionar para o tamanho desejado:
ou, equivalente, substituir
CGImageGetWidth(...)/DESIREDWIDTH
fonte
Rogerio Chaves responde como uma extensão rápida
E também bônus
fonte
Swift 3.0 com opção à prova de falhas (retorna a imagem original em caso de erro):
fonte
(Compatível com Swift 4) solução iOS 10+ e iOS <10 (usando,
UIGraphicsImageRenderer
se possível,UIGraphicsGetImageFromCurrentImageContext
caso contrário)fonte
Abordagem eficaz sem esticar a imagem Swift 4
// método de chamada
fonte
A resposta de @Paul Lynch é ótima, mas isso mudaria a proporção da imagem. Se você não deseja alterar a proporção da imagem e ainda deseja que a nova imagem seja adequada ao novo tamanho, tente isso.
fonte
use esta extensão
fonte
Swift 2.0:
fonte
Aqui meu código Swift, um tanto detalhado
fonte
guard
) àaspectRatioAwareSize
função para que ela não gere uma exceção de divisão por zero se os parâmetros de entrada para imageSize ou boxSize forem #CGSize.zero
Resposta rápida 4:
fonte
The scale factor to apply to the bitmap. If you specify a value of 0.0, the scale factor is set to the scale factor of the device’s main screen.
Descobri que é difícil encontrar uma resposta que você possa usar imediatamente no seu projeto Swift 3 . O principal problema de outras respostas é que elas não respeitam o canal alfa da imagem. Aqui está a técnica que estou usando em meus projetos.
Exemplo de uso:
Este código é uma reescrita da extensão da Apple, com suporte adicional para imagens com e sem canal alfa.
Como leitura adicional, recomendo verificar este artigo para diferentes técnicas de redimensionamento de imagem. A abordagem atual oferece desempenho decente, opera APIs de alto nível e fácil de entender. Eu recomendo segui-lo, a menos que você ache que o redimensionamento de imagem é um gargalo no seu desempenho.
fonte
Use esta extensão, caso precise redimensionar a largura / altura apenas com a proporção.
fonte