Bienvenue sur le forum !

Si vous souhaitez rejoindre la communauté, cliquez sur l'un de ces boutons !

Qt 5 : 5.9.1 - Qt Creator : 4.4.0 - Qt Installer : 2.0.3 - JOM : 1.1.2 - Qt Build suite : 1.7.0 - VS Qt 5 : 2.0.0

QImageWriter capricieux

December 2007 modifié dans Année 2007
Bonjour à tous,

je fais des petits sketches à la processing, mais avec qt. j'ai donc une appli qui charge au choix un des sketches, et lui donne un QPainter lié au QWidget principal, pour qu'il affiche ce qu'il veut. L'affichage se passe sans trop de soucis, mis à part que mon pc est trop lent donc ca rame. Pour régler ce problème, j'ai pensé à sauvegarder chaque image affichée dans un fichier (jpg par exemple), pour ensuite monter une vidéo à partir de ces fichiers.

Le soucis intervient dans la sauvegarde des fichiers. Un simple
QPixmap pixmap=new QPixmap();
pixmap.grabWindow(this.winId);
pixmap.save("image.jpg");
à la fin du paintEvent du QWidget, crée un fichier vide (0B), donc j'ai décidé de faire autrement:

j'ai un QImageWriter paramétré sur du jpg basse qualité, et voilà la fonction paintEvent du QWidget:
public void paintEvent(QPaintEvent e)
{
//mise à jour du sketch
QPainter tqp=new QPainter(this);
if(sketch!=null)
sketch.update(tqp);

QPixmap tqpm=new QPixmap(size());
tqpm.grabWindow(this.winId());
//ca c'est juste histoire d'avoir des fichiers rangés dans le bon ordre dans konqueror
if(nImages<10)
qiw.setFileName("tmp/image_000"+nImages+".jpg");
else if(nImages<100)
qiw.setFileName("tmp/image_00"+nImages+".jpg");
else if(nImages<1000)
qiw.setFileName("tmp/image_0"+nImages+".jpg");
else
qiw.setFileName("tmp/image_"+nImages+".jpg");
//ne renvoie jamais false
if(!qiw.write(tqpm.toImage()))
System.out.println(qiw.error());
nImages++;
//recommence quand il le sent
update();
}
les fichiers sont bien créés, non vides, mais seul le premier (des fois le second et et le troisième aussi) est rempli avec la bonne image, tous les autres fichiers sont complètement noirs, alors que l'intérieur du QWidget continue d'afficher ce quil faut.

vu que je bosse sur un pc pas super performant, pour éviter la possibilité qu'il n'ait pas le temps d'écrire les images, j'ai viré l'appel à update() en fin de fonction, remplacé par un appel par timer, mais quel que soit le délai que je lui laisse (même exagérément trop), toujours pas plus d'une ou deux image "remplies".

si vous avez une idée d'où ca pourrait venir, ou mieux une meilleure façon de faire ce recopiage de fenêtre, je suis tout ouïe.

Réponses

  • December 2007 modifié
    Salut,

    Pourquoi ne pas dessiner un sketch dans un QPixmap (c'est un QPainterDevice, tout comme un QWidget) que tu pourrais sauvegarder comme bon te semble? Après, tu utilises ce même pixmap pour le dessiner dans le widget (QPainter::drawPixmap)

    Edit: tu peux aussi utiliser un pixmap au niveau du paintEvent du widget, et y dessiner ce que tu veux; après, c'est pareil, tu peux utiliser ce pixmap comme contenu du widget.
  • En effet, il fallait mieux organiser tout ca différemment. Le widget fournit un pixmap que le sketch modifie, puis le widget affiche et sauvegarde tout ca. ca passe mieux.

    merci bien = )
Connectez-vous ou Inscrivez-vous pour répondre.