Voila, je cherche à faire un petit utilitaire qui unifierais la teinte de plusieurs images (pour unifier la luminosité d'un court métrage fait en stop motion)

J'ai fait un premier jet qui marche pas mal sur les images en BMP (meme si il reste pas mal de chose a faire), mais lorsque je teinte de le lancer avec des image JPG (type d'image que j'aurais a modifier), ca ne marche plus tout...



Bon, j'explique grosso modo ce que fais le prog, avant de mettre le code:
Il prend une première image en référence, calcule vite fais la moyenne r,g,b qu'elle a, puis prend une deuxième image, recalcule la moyenne.
Ensuite, on calcule la différence entre les deux, et on modifie chaque pixel de la deuxième image en additionnant avec cette différence. (il reste pas mal de chose a faire, genre proteger pour pas passer en couleurs négative, automatiser les tailles et tout, mais j'aimerais déja que ca marche pour des JPG)

Bon, voila le code:




Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#include <iostream>
#include <QString>
#include <QImage>
#include <QColor>
#include <QMessageBox>
#include <QApplication>
 
int main(int argc, char* argv[])
{
    int r, g, b; //couleur de reference
    int rn, gn, bn; //couleur de notre image en cour
    int rdif, gdif, bdif; //différence entre nos couleur de départ et les nouvelle
    int i, j, x; //i et j servent au boucle, x compte le nombre de passage dans la boucle
    int longueur, largeur; //taille de notre image
    QImage* image; //notre image
    QString nom; //variable servant a loader les images
    QRgb color; //sert a recuperer la couleure d'un pixel
 
 
 
QApplication app(argc, argv);
    /*on recupere la premiere image. Permettre plus tard a l'utilisateur de donner le nom via une interface */
 
    nom = "DSCF2430.JPG";
    image = new QImage(nom);
 
 
    /************************************
    taille d'images fixées en dur. A automatiser
    ************************************/
    largeur = 3072;
    longueur = 2304;
 
    /*on calcul nos moyenne de r,g,b*/
    r = 0;
    g = 0;
    b = 0;
    x=0;
    for(i=0;i<largeur/2; i=i+50)
    {
        color = image->pixel(i,i);
        r = r + qRed(color);
        g = g + qGreen(color);
        b = b + qBlue(color);
        x++;
    }
    r = r/x;
    g = g/x;
    b = b/x;
 
 
 
    /**************************
    on load notre deuxieme image...
    a transformer en boucle plus tard pour faire toute les images du dossier
    *****************************/
    nom = "DSCF2429.JPG";
    image->load(nom);
    //on calcul la moyenne de la deuxieme image
    rn = 0;
    gn = 0;
    bn = 0;
    x=0;
    for(i=0;i<largeur/2; i=i+50)
    {
        color = image->pixel(i,i);
        rn = rn + qRed(color);
        gn = gn + qGreen(color);
        bn = bn + qBlue(color);
        x++;
    }
    rn = rn/x;
    gn = gn/x;
    bn = bn/x;
 
 
 
    /***********************************
    on calcul les différences
    ***********************************/
    rdif = r - rn;
    gdif = g - gn;
    bdif = b - bn;
QMessageBox::information(NULL,"deplacement", QString::number(rdif));
 
    //on modifie la deuxieme image en fonction de nos variables dif
    for(i=0;i<largeur;i++)
    {
        for(j=0;j<longueur;j++)
        {
            color = image->pixel(i,j); //on recupere la couleur du pixel a mosifier
            color = qRgb(qRed(color)+rdif, qGreen(color)+gdif, qBlue(color)+bdif);
            image->setPixel(i,j,color);
        }
    }
 
    QMessageBox::information(NULL,"deplacement", "on va sauvegarder");
    //on sauvegarde l'image
    image->save(nom);
    QMessageBox::information(NULL,"deplacement", "j'ai fini");
 
return app.exec();
}


Voila. Si je met des images BMP pas de soucis.
Des que je tente avec des JPG, il marche pas du tout. C'est a dire que les variable de couleurs restent toujours a 0.