Meu aplicativo está baixando um conjunto de arquivos de imagem da rede e salvando-os no disco local do iPhone. Algumas dessas imagens são muito grandes (larguras maiores que 500 pixels, por exemplo). Como o iPhone nem mesmo tem uma tela grande o suficiente para mostrar a imagem em seu tamanho original, estou planejando redimensionar a imagem para algo um pouco menor para economizar espaço / desempenho.
Além disso, algumas dessas imagens são JPEGs e não são salvas com a configuração de qualidade normal de 60%.
Como posso redimensionar uma imagem com o iPhone SDK e como posso alterar a configuração de qualidade de uma imagem JPEG?
A maneira mais fácil e direta de redimensionar suas imagens seria esta
fonte
Os métodos acima funcionam bem para imagens pequenas, mas ao tentar redimensionar uma imagem muito grande, você rapidamente ficará sem memória e travará o aplicativo. Uma maneira muito melhor é
CGImageSourceCreateThumbnailAtIndex
redimensionar a imagem sem decodificá-la completamente primeiro.Se você tiver o caminho para a imagem que deseja redimensionar, pode usar isto:
Mais detalhes aqui .
fonte
CGImageSource
além de imagens e PDFs?inSampleSize
que é usado pelo decodificador do Android. E esta é a única resposta que fornece uma maneira de reduzir uma imagem de maneira eficiente em termos de memória.A melhor maneira de dimensionar imagens sem perder a proporção (ou seja, sem esticar a imagem) é usar este método:
Adicione este método à sua classe Utility para que você possa usá-lo em todo o seu projeto e acessá-lo desta forma:
Este método cuida do dimensionamento enquanto mantém a proporção da imagem. Também adiciona recuos à imagem caso a imagem reduzida tenha mais largura do que altura (ou vice-versa).
fonte
Se você tiver controle sobre o servidor, recomendo fortemente redimensionar as imagens do lado do servidor com ImageMagik . Baixar imagens grandes e redimensioná-las no telefone é um desperdício de muitos recursos preciosos - largura de banda, bateria e memória. Todos os quais são escassos em telefones.
fonte
Desenvolvi uma solução definitiva para dimensionamento de imagens em Swift.
Você pode usá-lo para redimensionar a imagem para preencher, preencher com aspecto ou ajustar o tamanho do tamanho especificado.
Você pode alinhar a imagem ao centro ou a qualquer uma das quatro bordas e quatro cantos.
E também você pode cortar o espaço extra que é adicionado se as proporções da imagem original e o tamanho do destino não forem iguais.
Existem exemplos de aplicação desta solução abaixo.
O retângulo cinza é a imagem do site de destino será redimensionada para. Círculos azuis em um retângulo azul claro são a imagem (usei círculos porque é fácil ver quando é redimensionado sem preservar o aspecto). A cor laranja clara marca as áreas que serão cortadas se você passar
trim: true
.Aspecto se ajusta antes e depois da escala:
Outro exemplo de ajuste de aspecto :
Aspecto se ajusta ao alinhamento superior:
Preenchimento de aspecto :
Preencher :
Usei upscaling em meus exemplos porque é mais simples de demonstrar, mas a solução também funciona para downscaling como em questão.
Para compressão JPEG, você deve usar isto:
Você pode verificar minha essência com o playground do Xcode.
fonte
Para Swift 3, o código abaixo dimensiona a imagem mantendo a proporção. Você pode ler mais sobre o ImageContext na documentação da Apple :
Para usá-lo, chame o
resizeImage()
método:fonte
você pode usar este código para dimensionar a imagem no tamanho necessário.
fonte
Um problema que pode ocorrer em telas de retina é que a escala da imagem é definida por ImageCapture ou algo assim. As funções de redimensionamento acima não vão mudar isso. Nestes casos, o redimensionamento não funcionará corretamente.
No código abaixo, a escala é definida como 1 (não dimensionada) e a imagem retornada tem o tamanho que você esperaria. Isso é feito na
UIGraphicsBeginImageContextWithOptions
chamada.fonte
Aumentando a quantidade de respostas aqui, mas eu escolhi uma solução que redimensiona por tamanho de arquivo, em vez de dimensões.
Isso reduzirá as dimensões e a qualidade da imagem até que ela atinja o tamanho determinado.
Crédito para resposta de escala por tamanho
fonte
Versão Swift
fonte
De acordo com esta sessão, iOS Memory Deep Dive , é melhor usarmos
ImageIO
para reduzir as imagens.O mal de usar
UIImage
imagens em escala reduzida.Usar
ImageIO
ImageIO pode ler tamanhos de imagem e informações de metadados sem sujar a memória.
ImageIO pode redimensionar imagens ao custo da imagem redimensionada apenas.
Sobre a imagem na memória
UIGraphicsBeginImageContextWithOptions
sempre usa oSRGB
formato de renderização, que usa 4 bytes por pixel.load -> decode -> render
3 fases.UIImage
é caro para dimensionar e redimensionarPara a imagem a seguir, se você usar
UIGraphicsBeginImageContextWithOptions
, precisamos apenas de 590 KB para carregar uma imagem, enquanto precisamos de2048 pixels x 1536 pixels x 4 bytes per pixel
= 10 MB ao decodificarenquanto
UIGraphicsImageRenderer
, introduzido no iOS 10, escolherá automaticamente o melhor formato gráfico no iOS12. Isso significa que você pode economizar 75% da memória substituindoUIGraphicsBeginImageContextWithOptions
porUIGraphicsImageRenderer
se não precisar de SRGB.Este é o meu artigo sobre imagens iOS na memória
ou
fonte
Acabei usando a técnica de Brad para criar um
scaleToFitWidth
método emUIImage+Extensions
se isso é útil para alguém ...então onde você quiser
#import "UIImage+Extensions.h"
UIImage *newImage = [image scaleToFitWidth:100.0f];
Também vale a pena notar que você pode mover isso mais para baixo em uma
UIView+Extensions
classe se quiser renderizar imagens de um UIViewfonte
Eu só queria responder a essa pergunta para os programadores Cocoa Swift. Esta função retorna NSImage com novo tamanho. Você pode usar essa função assim.
fonte
Se sua imagem estiver no diretório de documentos, adicione esta extensão de URL :
Uso:
Nota: - Altere <LocalImagePath.jpg> com o caminho da imagem jpg local.
fonte
Se alguém ainda está procurando a melhor opção
fonte
fonte
Para redimensionar uma imagem, tenho melhores resultados (gráficos) usando esta função em vez de DrawInRect:
A proporção é cuidada automaticamente
fonte