Nas últimas semanas, tenho trabalhado com imagens em objetiva-c e percebido muitos comportamentos estranhos. Primeiro, como muitas outras pessoas, tenho tido esse problema onde as imagens tiradas com a câmera (ou tiradas com a câmera de outra pessoa e MMS para mim) são giradas em 90 graus. Eu não tinha certeza de por que isso estava acontecendo (daí minha pergunta ), mas consegui encontrar uma solução barata.
Minha pergunta desta vez é por que isso está acontecendo ? Por que a Apple está girando as imagens? Quando tiro uma foto com a câmera voltada para cima, a menos que execute o código mencionado acima, quando salvo a foto, ela é salva girada. Agora, minha solução alternativa estava 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 jogada fora da janela para o meu cenário). Há alguns dias, percebi que, embora a imagem seja exibida corretamente em meu aplicativo graças ao meu código de solução alternativa, quando meu algoritmo modifica os pixels individuais da imagem, ele pensa que a imagem está girada. Então, ao invés de modificar os pixels na parte superior da imagem, ele modifica os pixels na lateral da imagem (porque ele acha que deveria ser girado)! Não consigo descobrir como girar a imagem na memória - o ideal é que eu prefira simplesmente apagar imageOrientation
toda essa bandeira.
Aqui está outra coisa que também está me confundindo ... Quando eu tiro a foto, o imageOrientation
é definido como 3. Meu código de solução alternativa é inteligente o suficiente para perceber isso e virá-lo para que o usuário nunca perceba. Além disso, meu código para salvar a imagem na biblioteca percebe isso, vira e salva para que apareça no rolo da câmera corretamente.
Esse código é assim:
NSData* pngdata = UIImagePNGRepresentation (self.workingImage); //PNG wrap
UIImage* img = [self rotateImageAppropriately:[UIImage imageWithData:pngdata]];
UIImageWriteToSavedPhotosAlbum(img, nil, nil, nil);
Quando eu carrego essa imagem recém-salva em meu aplicativo, o imageOrientation
é 0 - exatamente o que eu quero ver, e minha solução alternativa de rotação nem precisa ser executada (nota: ao carregar imagens da internet em oposição a imagens tiradas com uma câmera , o imageOrientation
é sempre 0, resultando em comportamento perfeito). Por algum motivo, meu código de salvamento parece apagar esse imageOrientation
sinalizador. Eu esperava apenas roubar esse código e usá-lo para limpar minha imageOrientation assim que o usuário tirar uma foto e adicioná-la ao aplicativo, mas não parece funcionar. Faz UIImageWriteToSavedPhotosAlbum
algo especial com imageOrientation
?
A melhor solução para esse problema seria simplesmente explodir imageOrientation
assim que o usuário terminar de tirar uma imagem. 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ê ainda não está perdido ... Obs2: Quando tiro uma foto horizontal, tudo parece funcionar perfeitamente, assim como as fotos tiradas da internet)
EDITAR:
Aqui estão algumas das imagens e cenários reais. Com base 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), ela aparece exatamente como no meu telefone quando tirei a foto:
Esta é a aparência da imagem no Gmail depois que eu a enviei por e-mail para mim mesmo (parece que o Gmail a lida corretamente):
Aqui está a aparência da imagem como uma miniatura no Windows (não parece que foi tratada corretamente):
E aqui está a aparência da imagem real quando aberta com o Windows Photo Viewer (ainda não tratada corretamente):
Depois de todos os comentários sobre esta questão, eis o que estou pensando ... O iPhone pega uma imagem e diz "para exibir isso corretamente, ela precisa ser girada 90 graus". Essas informações estariam nos dados EXIF. (Por que ele precisa ser girado 90 graus, em vez de padronizar para a vertical, eu não sei). A partir daqui, o Gmail é inteligente o suficiente para ler e analisar os dados EXIF e exibi-los corretamente. O Windows, entretanto, não é inteligente o suficiente para ler os dados EXIF e, portanto, exibe a imagem incorretamente . Minhas suposições estão corretas?