Page 1 sur 1

SaveImage creer une rotation

Publié : mar. 14/août/2018 6:01
par venom
Bonjour,

Je suis sur un petit soft qui redimensionne une image et la sauvegarde ensuite.
Il s’avère que si on sauvegarde une image qui a la base est en .bmp ou .png vers n'importe quel format, aucune rotation ne s’exécute.
En revanche, si l'image de base est un .jpg et bien l'image final va subir une rotation. 8O :?

Voici le code de base dans l'aide de purebasic

Code : Tout sélectionner

LoadImage(0, #PB_Compiler_Home+"Examples\Sources\Data\GeeBee2.bmp") ; Charge l'image depuis un fichier
  SaveImage(0, GetTemporaryDirectory() + "ok.bmp") ; Enregistre
ce dernier fonctionne très bien puisque l'image d'origine choisi est une .bmp

Voici un second code qui vous fait choisir une image, et vous demande ou la sauvegarder.

Code : Tout sélectionner

UseJPEGImageDecoder()
UseJPEGImageEncoder()
UsePNGImageDecoder()

CheminImage$ = OpenFileRequester("Choisir une image", "", "images|*.jpg;*.bmp;*.png", 0)
LoadImage(0, CheminImage$) ; Charge l'image

CheminSave$ = SaveFileRequester("Sauvegarde de l'image", "", "images jpg|*.jpg", 0)
SaveImage(0, CheminSave$+".jpg") ; Enregistre l'image
et bien si avec ce deuxième code, vous ouvrez une image .jpg elle va subir une rotation.
EDIT :Le pire, c'est que cela ne se produit pas sur tout les .jpg :? certaines images ne subissent pas cette rotation :twisted:

Ma question est pourquoi ? 8O
D'avance merci






@++

Re: SaveImage creer une rotation

Publié : mar. 14/août/2018 7:03
par Ar-S
Salut,
Je me suis rendu compte de ce phénomène sur la version 5.6x depuis quelques temps via mon Resizer Gold. Je n'ai pas eu le temps de tenter de voir pourquoi mais c'est en effet gênant.
Ma 1ère théorie serait que ça viendrait d'une gestion bancale des infos exif mais j'avoue que si Fred ou quelqu'un pouvait nous en donner la raison et surtout comment gérer ce soucis ce serait vraiment bien.
En attendant, essaye de le compiler avec une version plus ancienne de PB pour voir si ça se produit histoire de cibler si ça bien bien d'une version PB en particulier comme je le pense.

Re: SaveImage creer une rotation

Publié : mar. 14/août/2018 7:05
par Marc56
Le jpg que tu ouvres et qui tourne "tout seul" ne serait-il pas une photo prise à la verticale et qui s'affiche alors à l'horizontal ?
:arrow: EXIF

Loadimage ne fait que lire l'image telle qu'elle est enregistrée (et elle est normalement à l'horizontal même si l'apn était en mode vertical).

À mon avis il est donc bien que PB lise le fichier tel qu'il est. Ou alors il faudrait une fonction (ou une option à LoadImage) capable de lire l'EXIF et de tourner ou pas l'image.

La rotation d'une image n'est pas une fonction native, c'est à l'utilisateur de lire l'EXIF et de tourner l'image.
(Ex: Irfanview: Propriété > JPG > Auto rotoate image according exif info)

:idea: La lib image ne permet pas de faire tourner une image, par contre la nouvelle lib VectorDrawing le permet
https://www.purebasic.com/french/docume ... nates.html

:wink:

Re: SaveImage creer une rotation

Publié : mar. 14/août/2018 10:38
par venom
Marc56 a écrit :ne serait-il pas une photo prise à la verticale et qui s'affiche alors à l'horizontal ?
Je n'en ai pas la certitude mais je pense que oui. Je ferais un test avec mon appareil photo.

En revanche le terme exif m'est inconnu. Je vais me renseigner surle sujet.
Marc56 a écrit :Ou alors il faudrait une fonction (ou une option à LoadImage) capable de lire l'EXIF et de tourner ou pas l'image.
Ce genre d'option pourrait être sympa en effet :P


Merci a vous:wink:







@++

Re: SaveImage creer une rotation

Publié : mar. 14/août/2018 12:21
par poshu
venom a écrit :En revanche le terme exif m'est inconnu. Je vais me renseigner surle sujet.
Exif, aka EXchangeable Image file Format, c'est un ensemble de données sur les images et les sons comme la géolocalisation, l'exposition ou ... l'inclinaison de l'appareil.
Marc56 a écrit :Ou alors il faudrait une fonction (ou une option à LoadImage) capable de lire l'EXIF et de tourner ou pas l'image.

Code : Tout sélectionner

Procedure RemoveExif(Image)
	Protected tmpImage
	
	tmpImage = CopyImage(Image,#PB_Any)
	
	FreeImage(Image)
	CreateImage(Image,ImageWidth(tmpImage),ImageHeight(tmpImage),ImageDepth(tmpImage))
	StartDrawing(ImageOutput(Image))
	DrawImage(ImageID(tmpImage),0,0)
	StopDrawing()
	
	FreeImage(tmpImage)
EndProcedure
Un simple bricolage comme celui là suffit pour supprimer les info exifs, plus de retournement intempestif.

Re: SaveImage creer une rotation

Publié : mar. 14/août/2018 14:16
par Marc56
JJe suis sur un petit soft qui redimensionne une image et la sauvegarde ensuite.
Il s’avère que si on sauvegarde une image qui a la base est en .bmp ou .png vers n'importe quel format, aucune rotation ne s’exécute.
En revanche, si l'image de base est un .jpg et bien l'image final va subir une rotation.
Si tu fais un simple chargement, redim, puis sauvegarde avec les fonctions PB, tu perds les infos EXIF et tu sauvegarde l'image telle qu'elle s'affiche.
Une photo prise en mode portrait apparaitra donc tournée de 90° dans un sens ou l'autre selon la rotation de l'APN
Il serait plus intéressant de lire l'info EXIF et tourner l'image dans le bon sens avant de sauvegarder

EXIF
https://fr.wikipedia.org/wiki/Exchangea ... ile_format

Info pour l'orientation
http://owl.phy.queensu.ca/~phil/exiftoo ... /EXIF.html

0x0112 Orientation int16u IFD0
1 = Horizontal (normal)
2 = Mirror horizontal
3 = Rotate 180
4 = Mirror vertical
5 = Mirror horizontal and rotate 270 CW
6 = Rotate 90 CW
7 = Mirror horizontal and rotate 90 CW
8 = Rotate 270 CW

Tu auras principalement 6 ou 8 selon que l'image doit être tournée de 90° dans un sens ou l'autre
(CW = clockwise direction = sens horaire)

Avec un "peek" au bon endroit, tu devrait pouvoir récupérer l’orientation sans avoir à utiliser une lib qu'on trouve sur le forum.

:wink:

Re: SaveImage creer une rotation

Publié : ven. 17/août/2018 6:44
par venom
Merci pour vos infos. En effet les images en question sont a 270°
8O c'est fou, je ne savais pas qu'une image stocker autant d'information. Il y a même les coordonnées GPS. (Un peu comme les tag ID3 des musiques)

Je vais regarder a tout ça.






@++