1. Ce site utilise des cookies. En continuant à utiliser ce site, vous acceptez l'utilisation des cookies. En savoir plus.
  2. Bonjour tout le monde ! Veillez consulter la Politique de forum pour comprendre nos règles, Merci a vous !
    Rejeter la notice

AIDE [Résolu] Compresser une image

Discussion dans 'Windev Mobile' créé par ANDRE3000, Août 9, 2018.

  1. ANDRE3000

    ANDRE3000 Member

    Inscrit:
    Juin 5, 2018
    Messages:
    50
    J'aime reçus:
    3
    Bonjour à tous j'espère que vous allez bien? Je développe actuellement une application avec windev mobile 20 qui me permet de uploader des des images dans ma base de donnée le problème est le suivant lorsque j'upload les images dans cette base de données les images varie .soit certaines images à une taille de 2 Mo et d'autres vont jusqu'à 8 Mo le problème est que tous ces fichiers en enregistrant dans la base de données devient trop lourde . ce que j'aimerais savoir est il possible de compresser les images que j'upload en une taille identique par exemple tous les images uploader seront compresser à la taille de 1 Mo merci d'avance
     
    rayan apprécie ceci.
  2. Ezekiel056

    Ezekiel056 Active Member

    Inscrit:
    Jan 17, 2018
    Messages:
    200
    J'aime reçus:
    154
    Bonjour,

    C'est délicat de savoir la taille a l'avance .. ça dépend tellement du contenu de l'image.
    Par contre il est tout a fait possible de réduire la qualité d'une image JPG pour diminuer sa taille. (le JPG étant déjà un format compressé, on peut pas compresser d'avantage sauf en réduisant la qualité)


    Il suffit pour cela d'utiliser la fonction

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

    :

    Exemple :

    Code (Windev):

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

    (IMG_MonChampImage, sRepertoireDonnées, 75)
     
    On peut approfondir, en faisant une boucle :
    Code (Windev):

    bTailleOk est un booléen = Faux
    nTauxCompression est un entier = 90
    TANTQUE ( (bTailleOk = faux )_ou_ (nTauxCompression < 10) )
       

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

    (IMG_MonChampImage, sCheminFichier, nTauxCompression )  
       SI

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

    (sCheminFichier) < 1024 ALORS // si la taille est  inférieure à 1024  octets (soit 1Mo)
           bTailleOk = Vrai // Ok on sort de la boucle
       SINON
           nTauxCompression -=  10 // on baisse la qualité
       FIN
    FIN
     
    Ici, tant que le fichier ne fait pas moins de 1Mo ou que le taux de compression n'atteint pas 10 on compresse.
     
  3. popoy

    popoy Well-Known Member
    MEMBRE WX

    Inscrit:
    Fev 23, 2018
    Messages:
    2,882
    J'aime reçus:
    1,532
    Sa mobile il n'est pas nécessaire d'avoir des images de format 3 mètres.
    Tu regarde le champ le plus grand de ton application et tu redimentionne a la taille qu'il faut cela réduira aussi le poid.
    voir

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!


    après la solution de

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

    est très bien.
     
    ANDRE3000, suenodesign et joker aiment ça.
  4. Ezekiel056

    Ezekiel056 Active Member

    Inscrit:
    Jan 17, 2018
    Messages:
    200
    J'aime reçus:
    154

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!



    Je crois même que l'on peut le faire avec une variable de type Image, puis utiliser les fonctions "d"

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

    par exemple

    Il y a même moyen apparemment d'appliquer des modes d'affichage aux images mais je ne me souviens plus de l'info.. :(
     
    joker et suenodesign aiment ça.
  5. redha2010

    redha2010 Active Member

    Inscrit:
    Jan 25, 2018
    Messages:
    230
    J'aime reçus:
    226

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

    Bonjour à tous j'espère que vous allez bien? Je développe actuellement une application avec windev mobile 20 qui me permet de uploader des des images dans ma base de donnée le problème est le suivant lorsque j'upload les images dans cette base de données les images varie .soit certaines images à une taille de 2 Mo et d'autres vont jusqu'à 8 Mo le problème est que tous ces fichiers en enregistrant dans la base de données devient trop lourde . ce que j'aimerais savoir est il possible de compresser les images que j'upload en une taille identique par exemple tous les images uploader seront compresser à la taille de 1 Mo merci d'avance
    Cliquez pour agrandir...
    si tu enregistre tes photos dans ta base de données , le problème restera posé car la décryptage des photos rendra l'accé a ta base de données lourds
    je préféré de stocker les images aprés l'upload sur le serveur dans un répertoire images et sauvegarde simplement le nom du photo dans un rubrique texte
    l'affichage sera plus rapide que d'utiliser l'affichage des photos stockés dans une rubrique photo
     
  • Ezekiel056

    Ezekiel056 Active Member

    Inscrit:
    Jan 17, 2018
    Messages:
    200
    J'aime reçus:
    154

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

    c'est un choix aussi effectivement.
    Il y a des partisans du pour et du contre.

    Personnellement je préfère ta méthode aussi, c'est plus flexible ;)
     
  • Man

    Man Active Member

    Inscrit:
    Juil 9, 2018
    Messages:
    290
    J'aime reçus:
    67
    Bonjour à tous il est vrai que je viens très tard à ce sujet j'utilise toujours ce code
    [windev]// Donne la rotation de l'image
    import android.media.ExifInterface;
    import java.lang.Exception;
    import android.graphics.*;
    import android.util.Log;
    import java.io.FileOutputStream;

    public static boolean TraitePhotoJava(String sPhoto, int nTailleMax){
    int nRotation = 0;
    boolean res = false;

    try{
    ExifInterface m_exif = new ExifInterface(sPhoto);
    nRotation = (int)exifOrientationToDegrees(m_exif.getAttributeInt(ExifInterface.TAG_ORIENTATION,ExifInterface.ORIENTATION_NORMAL));

    // BITMAP
    BitmapFactory.Options bounds = new BitmapFactory.Options();
    // Réduit la taille
    Bitmap sourceBitmap = BitmapFactory.decodeFile(sPhoto,bounds);

    if (sourceBitmap == null){
    return false;
    }

    // Rotation
    Matrix matrix = new Matrix();
    if (nRotation > 0) {
    matrix.preRotate(nRotation);
    }

    // redimensionnement
    int width = sourceBitmap.getWidth();
    int height = sourceBitmap.getHeight();
    int newWidth;
    int newHeight;
    if (width > height){
    newWidth = nTailleMax;
    newHeight = (int) nTailleMax * height / width;
    }
    else{
    newHeight = nTailleMax;
    newWidth = (int) nTailleMax * width / height;
    }
    float scaleWidth = ((float) newWidth) / width;
    float scaleHeight = ((float) newHeight) / height;
    matrix.postScale(scaleWidth, scaleHeight);


    // Création du nouveau bitmap
    Bitmap resizedBitmap = Bitmap.createBitmap(sourceBitmap, 0, 0, width, height, matrix, true);
    sourceBitmap.recycle();

    if (resizedBitmap == null){
    return false;
    }

    // Sauvegarde
    FileOutputStream out = new FileOutputStream(sPhoto);
    res = resizedBitmap.compress(Bitmap.CompressFormat.JPEG , 100, out);
    resizedBitmap.recycle();

    resizedBitmap = null;
    sourceBitmap = null;

    return res;
    }
    catch(Exception e) {
    Log.e("MO",e.toString());
    return false;
    }

    }

    public static float exifOrientationToDegrees(int exifOrientation) {
    if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_90) {
    return 90;
    } else if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_180) {
    return 180;
    } else if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_270) {
    return 270;
    }
    return 0;
    }[/windev]
    après j'appelle la procédure dans le callback
    [windev]// Traitement des données exif et redimensionnement
    TraitePhotoJava(FEN_Scan.gsPhotoAjout,TAILLE_MAX_PHOTO)

    // Chargement du buffer
    bufIMG = fChargeBuffer(FEN_Scan.gsPhotoAjout)[/windev]
     
    joker apprécie ceci.
  • lsasplugas

    lsasplugas New Member

    Inscrit:
    Oct 17, 2020
    Messages:
    3
    J'aime reçus:
    0
    Merci pour ta réponde Man.

    Ma question est toute simple.
    Sans avoir essayé ta solution, je présume qu'elle est prévue pour Android (import android.media.ExifInterface).
    Comment résoudre le même problème pour iOS?

    En d'autres termes : pour iOS je vais sans doute avoir le même problème que pour Android : dRedimensionne ne maintien pas l'orientation originale de l'image donc il va me falloir passer par un système android.media.ExifInterface équivalent pour iOS, n'est-ce pas?

    Merci pour ton aide!


    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

    Bonjour à tous il est vrai que je viens très tard à ce sujet j'utilise toujours ce code
    [windev]// Donne la rotation de l'image
    import android.media.ExifInterface;
    import java.lang.Exception;
    import android.graphics.*;
    import android.util.Log;
    import java.io.FileOutputStream;

    public static boolean TraitePhotoJava(String sPhoto, int nTailleMax){
    int nRotation = 0;
    boolean res = false;

    try{
    ExifInterface m_exif = new ExifInterface(sPhoto);
    nRotation = (int)exifOrientationToDegrees(m_exif.getAttributeInt(ExifInterface.TAG_ORIENTATION,ExifInterface.ORIENTATION_NORMAL));

    // BITMAP
    BitmapFactory.Options bounds = new BitmapFactory.Options();
    // Réduit la taille
    Bitmap sourceBitmap = BitmapFactory.decodeFile(sPhoto,bounds);

    if (sourceBitmap == null){
    return false;
    }

    // Rotation
    Matrix matrix = new Matrix();
    if (nRotation > 0) {
    matrix.preRotate(nRotation);
    }

    // redimensionnement
    int width = sourceBitmap.getWidth();
    int height = sourceBitmap.getHeight();
    int newWidth;
    int newHeight;
    if (width > height){
    newWidth = nTailleMax;
    newHeight = (int) nTailleMax * height / width;
    }
    else{
    newHeight = nTailleMax;
    newWidth = (int) nTailleMax * width / height;
    }
    float scaleWidth = ((float) newWidth) / width;
    float scaleHeight = ((float) newHeight) / height;
    matrix.postScale(scaleWidth, scaleHeight);


    // Création du nouveau bitmap
    Bitmap resizedBitmap = Bitmap.createBitmap(sourceBitmap, 0, 0, width, height, matrix, true);
    sourceBitmap.recycle();

    if (resizedBitmap == null){
    return false;
    }

    // Sauvegarde
    FileOutputStream out = new FileOutputStream(sPhoto);
    res = resizedBitmap.compress(Bitmap.CompressFormat.JPEG , 100, out);
    resizedBitmap.recycle();

    resizedBitmap = null;
    sourceBitmap = null;

    return res;
    }
    catch(Exception e) {
    Log.e("MO",e.toString());
    return false;
    }

    }

    public static float exifOrientationToDegrees(int exifOrientation) {
    if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_90) {
    return 90;
    } else if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_180) {
    return 180;
    } else if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_270) {
    return 270;
    }
    return 0;
    }[/windev]
    après j'appelle la procédure dans le callback
    [windev]// Traitement des données exif et redimensionnement
    TraitePhotoJava(FEN_Scan.gsPhotoAjout,TAILLE_MAX_PHOTO)

    // Chargement du buffer
    bufIMG = fChargeBuffer(FEN_Scan.gsPhotoAjout)[/windev]
    Cliquez pour agrandir...
     
  • popoy

    popoy Well-Known Member
    MEMBRE WX

    Inscrit:
    Fev 23, 2018
    Messages:
    2,882
    J'aime reçus:
    1,532

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

    , je crois me souvenir qu'il existe une é l'option 'Orienter selon les données Exif de l'image'

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

    a été obligé de faire une fonction java car il est passé par un buffer.
    Si tu fais une simple affectation de l'image cela gère l'exif.
     
  • lsasplugas

    lsasplugas New Member

    Inscrit:
    Oct 17, 2020
    Messages:
    3
    J'aime reçus:
    0

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

    , je crois me souvenir qu'il existe une é l'option 'Orienter selon les données Exif de l'image'

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

    a été obligé de faire une fonction java car il est passé par un buffer.
    Si tu fais une simple affectation de l'image cela gère l'exif.
    Cliquez pour agrandir...
    Cette option est effectivement disponible dans le champ image mais uniquement pour Android.
    Mon problème est comment faire pour iOS?

    J'en profite pour dire que le code de

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

    marche a la perfection et sans aucune complication pour mettre en place sa solution.
    Je pense que l'idéal serai avoir un code équivalant en Objective-C ou Swift à moins que quelqu'un ne connaisse une solution plus simple.

    Mon but est d'uploader les photos par webservice plutôt que de les afficher sur le terminal mobile.

    Merci pour votre aide.

    .
     
  • popoy

    popoy Well-Known Member
    MEMBRE WX

    Inscrit:
    Fev 23, 2018
    Messages:
    2,882
    J'aime reçus:
    1,532
    Une piste
    Mais je suis nul en iOS

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

     
  • lsasplugas

    lsasplugas New Member

    Inscrit:
    Oct 17, 2020
    Messages:
    3
    J'aime reçus:
    0

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

    Une piste
    Mais je suis nul en iOS

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

    Cliquez pour agrandir...
    Merci popoy.
    J'ai eu un retour de PCSoft qui me confirme que ceci est la bonne approche.

    Je n'ai pas besoin de faire rotation de l'image puisqu'en WLangage ça se fait sans problème. Ce qu'il me faut c'est le code pour iOS pour extraire l'angle de l'image. Mais je vais quand même jeter un coup d'œil sur ton lien pour voir ce que ji trouve.
     
  • popoy

    popoy Well-Known Member
    MEMBRE WX

    Inscrit:
    Fev 23, 2018
    Messages:
    2,882
    J'aime reçus:
    1,532

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

    , le lien t'indique comment comprendre l'exif sous iOS ce qui ne se fait pas de la même façon que Android.
    Surtout la partie orientation qui fournit les constantes

    switch (orientation) {
    case UIImageOrientationLeft: { // EXIF #8
    case UIImageOrientationDown: { // EXIF #3
    case UIImageOrientationRight: { // EXIF #6
    case UIImageOrientationUp: // EXIF #1 - do nothing
    default: // EXIF 2,4,5,7 - ignore
     
  • kuimei

    kuimei New Member

    Inscrit:
    Août 15, 2023
    Messages:
    1
    J'aime reçus:
    0
  • Partager cette page

    Chargement...