Pergunta

Eu estou agarrando uma imagem do rolo da câmera e, em seguida, usá-lo por um tempo, bem como salvar no disco como um PNG no iPhone. Estou recebendo o acidente estranho, provavelmente devido à falta de memória.

Faz alguma diferença se eu guardá-lo como PNG ou JPG (supondo que eu escolher nota para degradar a qualidade no caso JPG)? Especificamente:

  • é mais memória, em seguida, usado pelo UIImage depois recarregá-lo fora do disco se eu salva-lo como um PNG?
  • é possível o ato de salvar como PNG usa mais memória transitoriamente durante o processo de poupança?

Eu estava assumindo o UIImage era uma representação neutra formato e não deveria importar, mas eu pensei que eu deveria verificar.

Foi útil?

Solução

Eu tenho um aplicativo na loja que precisa salvar versões intermediárias de uma imagem, uma vez que está sendo editado. Na versão original, eu usei formato PNG para salvar, a perda da qualidade evitar de carregar e salvar JPEG várias vezes.

Por volta do versão 2.2 do software, a Apple introduziu uma mudança no código escrito PNG, de tal forma que leva muitas vezes mais tempo para salvar os dados PNG a partir de algumas imagens. Acabei por ter de mudar para salvar no formato JPEG, porque a minha candidatura foi o tempo limite ao tentar salvar imagens na saída.

Além disso, você vai correr em problemas porque salvar em formato PNG não preserva as informações "orientação" no UIImage, então uma foto tirada na orientação retrato com a câmera embutida aparecerá girado depois de salvar e recarregar -lo.

Outras dicas


Estou recebendo o acidente estranho, provavelmente devido à falta de memória


Em seguida, parar o que está fazendo agora e primeiro descobrir se isso é realmente a causa do acidente. Caso contrário, há uma boa chance de que você está perseguindo o problema errado aqui, a fixação de um problema de memória que não existe, ignorando a verdadeira causa do acidente. Se você quiser corrigir uma falha, começar por descobrir o que causou o acidente . Seguindo-se sobre o que é "presumivelmente" o problema é uma receita para o tempo e esforço desperdiçado.

Depende de que tipo de imagens que você está lidando. Se você está lidando com imagens fotográficas, JPEGs será quase sempre menor do que PNGs, sem perda perceptível de detalhe como pode ser visto pelo olho humano.

Por outro lado, se você está lidando com imagens altamente não-fotográficos, como elementos gráficos ou imagens com grandes blocos de cores sólidas, em seguida, PNGs e JPEGs será comparável em tamanho, mas o PNG vai economizar losslessly enquanto o JPEG será lossy e têm artefatos muito visíveis. Se você tem um realmente simples imagem (muito grandes blocos de cores constantes, por exemplo), então um PNG, muito provavelmente, ser muito menor do que um JPEG, e novamente não terá quaisquer artefatos de compressão.

O ato de salvar uma imagem como PNG ou JPEG não deve ocupar muito memória transitória. Quando uma imagem é na memória, ele é normalmente armazenado descompactado na memória para que possa ser desenhado na tela muito rapidamente, ao invés de ter que descompactá-lo cada vez que você quiser torná-lo. Em comparação com o tamanho da imagem não comprimido, a quantidade de armazenamento temporário extra que você precisa para comprimi-lo é muito pequena. Se você pode ajustar a imagem descompactada na memória, você não precisa se preocupar com a memória usada enquanto comprimindo-o.

E, claro, uma vez que você gravar a imagem do sistema de arquivos no armazenamento não volátil e libertar a imagem na memória, ele realmente não importa quão grande a imagem compactada é, porque não ocupam principal memória mais. O tamanho da imagem comprimido só afeta armazenamento flash quanto ele está usando, o que pode ser um problema, mas não afeta a alta probabilidade seu aplicativo é executado fora de memória.

Seus acidentes pode ser de um vazamento de memória conhecidos na UIImagePickerController.

Isso deve ajudar a corrigir isso.

Eu não tenho quaisquer dados concretos, mas eu supor que PNGs são preferíveis porque a Apple parece usar PNGs praticamente em todo iPhone OS.

No entanto, se você já tem o código configurado para escrever PNGs, ele não deve ser muito difícil de alterá-lo para JPEGs gravação, deveria? Basta tentar ambos os métodos e ver qual funciona melhor.

Use PNG sempre que possível. Como parte do XCode compilação executa todos os arquivos PNG através de um utilitário (pngcrush) para comprimir e otimizá-los.

  1. é mais memória, em seguida, usado pelo UIImage depois recarregá-lo fora disco se eu salva-lo como um PNG? => Não, é o mesmo tamanho da memória se você importar a partir de 2 imagens que têm mesma resolução e mesmo número de canais. (Tais como RGBA)
  2. é possível o ato de salvar como PNG usa mais memória transitoriamente durante o processo de poupança? => Não, é apenas o efeito a sua memória em disco.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top