A orientação de imagem do iOS tem comportamento estranho

Nas últimas semanas, tenho trabalhado com imagens no objetivo-c e percebi um comportamento estranho. Primeiro, como muitas outras pessoas, tenho tido esse problema em que as imagens capturadas com a câmera (ou tiradas com a câmera de outra pessoa e MMSs para mim) são giradas em 90 graus. Eu não tinha certeza porque no mundo isso estava acontecendo (daíminha pergunta) mas consegui criar um trabalho barato.

Minha pergunta desta vez éPor que isso está acontecendo? Por que a Apple está girando imagens? Quando tiro uma foto com a câmera do lado direito, a menos que eu execute o código mencionado acima, quando salvo a foto, ela é salva e girada. Agora, minha solução foi bem até alguns dias atrás.

Meu aplicativo modifica pixels individuais de uma imagem, especificamente o canal alfa de um PNG (para que qualquer conversão JPEG seja descartada da janela para o meu cenário). Há alguns dias, notei que, embora a imagem seja exibida corretamente no meu aplicativo, graças ao meu código de solução, quando meu algoritmo modifica os pixels individuais da imagem, ela acha que a imagem é girada. Então, ao invés de modificar os pixels na parte superior da imagem, ela modifica os pixels na lateral da imagem (porque ela acha que deve ser girada)! Eu não consigo descobrir como girar a imagem na memória - idealmente eu preferiria simplesmente limparimageOrientation bandeira todos juntos.

Aqui está outra coisa que tem me desconcertado também ... Quando eu tiro a foto,imageOrientation está definido como 3. Meu código de solução é inteligente o suficiente para perceber isso e virar para que o usuário nunca perceba. Além disso, meu código para salvar a imagem na biblioteca percebe isso, vira,então economiza para que apareça no rolo da câmera corretamente.

Esse código parece assim:

NSData* pngdata = UIImagePNGRepresentation (self.workingImage); //PNG wrap 
UIImage* img = [self rotateImageAppropriately:[UIImage imageWithData:pngdata]];   
UIImageWriteToSavedPhotosAlbum(img, nil, nil, nil);

Quando carrego essa imagem recém-salva no meu aplicativo,imageOrientation é 0 - exatamente o que eu quero ver, e a minha solução alternativa de rotação nem precisa ser executada (observação: ao carregar imagens da Internet em vez de imagens tiradas com uma câmera,imageOrientation é sempre 0, resultando em um comportamento perfeito). Por alguma razão, meu código de salvamento parece apagar esteimageOrientation bandeira. Eu esperava apenas roubar esse código e usá-lo para apagar meu imageOrientation assim que o usuário tira uma foto e a adiciona ao aplicativo, mas parece que não funciona. FazUIImageWriteToSavedPhotosAlbum faça algo especial comimageOrientation?

Será que a melhor solução para este problema seria simplesmente explodirimageOrientation assim que o usuário terminar de tirar uma foto. Presumo que a Apple tenha o comportamento de rotação feito por um motivo, certo? Algumas pessoas sugeriram que este é um defeito da Apple.

(... se você não estiver perdido ainda ... Nota2: Quando eu tiro uma foto horizontal, tudo parece funcionar perfeitamente, assim como fotos tiradas da internet)

EDITAR:

Aqui estão algumas das imagens e cenários que realmente se parecem. Baseado nos comentários até agora, parece que esse comportamento estranho é mais do que apenas um comportamento do iPhone, o que eu acho bom.

Esta é uma foto da foto que tirei com meu telefone (observe a orientação correta), aparece exatamente como no meu telefone quando eu tirei a foto:

Aqui está a aparência da imagem no Gmail depois que eu enviei por e-mail para mim mesmo (parece que o Gmail lida corretamente):

Aqui está o que a imagem parece como uma miniatura no Windows (não parece que é tratada corretamente):

E aqui está a aparência da imagem real quando aberta no Windows Photo Viewer (ainda não tratada corretamente):

Depois de todos os comentários sobre esta questão, aqui está o que eu estou pensando ... O iPhone tira uma imagem e diz "para exibir isso corretamente, ele precisa ser girado em 90 graus". Esta informação estaria nos dados EXIF. (Por que ele precisa ser girado em 90 graus, ao invés de ficar na vertical, eu não sei). A partir daqui, o Gmail é inteligente o suficiente para ler e analisar esses dados EXIF ​​e exibi-los corretamente. No entanto, o Windows não é inteligente o suficiente para ler os dados EXIF ​​e, portanto, exibe a imagemindevidamente. As minhas suposições estão corretas?

questionAnswers(11)

yourAnswerToTheQuestion