Personal tools
You are here: Home Historique news 2009 Février Mini programme pour scanner
Log in


Forgot your password?
New user?
 

Mini programme pour scanner

by Benjamin Poulain last modified Feb 23, 2009 02:35 PM

SimpleScan: quelques lignes de code pour contrôler scanimage.

Mes parents viennent d'acquérir un scanner, et m'ont demandé de l'installer sur leur ordinateur (qui est sous Ubuntu). Le scanner a tout de suite été reconnu par sane et fonctionne avec scanimage, mais à ma grande surprise, pas moyen de scanner avec xsane ou xscanimage. J'essaye le dernier snapshot sur CVS, même problème, ça marche en ligne de commande mais ça bloque avec l'interface graphique.

Ne pouvant manifestement pas laisser mes parents sans scanner, je lance emacs et je leur programme rapidement un petit truc en Qt 4. Après quelques minutes, j'avais une application avec trois boutons pour scanner des images:

SimpleScan

Si vous avez le même problème que moi, ou si vos parents préfèrent aussi les applications avec 3 boutons, voici le code source (sans licence, faites ce que vous voulez avec):

#include <QtGui>

class MainWindow : public QMainWindow
{
Q_OBJECT
public:
  MainWindow(){
    QWidget *mainWidget = new QWidget(this);
    QVBoxLayout *mainLayout = new QVBoxLayout(mainWidget);
    preview = new QLabel;
    mainLayout->addWidget(preview);

    progressBar = new QProgressBar;
    progressBar->setRange(0,0);
    progressBar->hide();
    mainLayout->addWidget(progressBar);

    scan = new QPushButton(QString::fromUtf8("Numériser"));
    connect(scan, SIGNAL(clicked(bool)), this, SLOT(startScan()));
    save = new QPushButton("Sauver");
    save->setEnabled(false);
    connect(save, SIGNAL(clicked(bool)), this, SLOT(saveImage()));

    QPushButton *quit = new QPushButton("Quitter");
    connect(quit, SIGNAL(clicked(bool)), qApp, SLOT(quit()));
    
    QHBoxLayout *buttonLayout = new QHBoxLayout();
    buttonLayout->addWidget(scan);
    buttonLayout->addWidget(save);
    buttonLayout->addWidget(quit);
    mainLayout->addLayout(buttonLayout);

    process = new QProcess(this);
    process->setStandardOutputFile("/tmp/scantmp.tiff");
    connect(process, SIGNAL(finished(int,QProcess::ExitStatus)), 
	    this, SLOT(scanFinished(int,QProcess::ExitStatus)));
    connect(process, SIGNAL(error(QProcess::ProcessError)), 
	    this, SLOT(scanError(QProcess::ProcessError)));
    setCentralWidget(mainWidget);
    statusBar()->showMessage(QString::fromUtf8("Prêt à scanner"));
  }

private slots:
  void scanFinished(int exitCode,QProcess::ExitStatus exitStatus){
    scan->setEnabled(true);
    if(exitStatus == QProcess::NormalExit && exitCode==0){
      save->setEnabled(true);
      scan->setText(QString::fromUtf8("Numériser"));
      progressBar->hide();
      image = QImage("/tmp/scantmp.tiff");
      QPixmap pixmap = QPixmap::fromImage(image);
      preview->setPixmap(pixmap.scaled(QSize(400, 400), Qt::KeepAspectRatio));
      QString msg = QString::fromUtf8("Appuyez sur Sauver pour sauver l'image, ou sur Numériser pour scanner autre chose");
      statusBar()->showMessage(msg);
    }
  }
  void scanError(QProcess::ProcessError error){
    preview->setText(QString::fromUtf8("Erreur lors de scanimage, QProcessError = %1").arg(error));
  }
  void startScan(){
    if(process->state() != QProcess::NotRunning){ // for race conditions
      process->waitForFinished(-1);
    }
    scan->setText(QString::fromUtf8("Numérisation en cours"));
    statusBar()->showMessage(QString::fromUtf8("Numérisation en cours, veuillez patienter"));
    scan->setEnabled(false);
    save->setEnabled(false);
    progressBar->show();

    process->start("scanimage --format=tiff --mode Color");
  }
  void saveImage(){
    QString fileName = QFileDialog::getSaveFileName(this, 
						    "Sauver l'image", 
						    QDir::homePath() + QString("/image.png"), 
						    "PNG (*.png)");
    image.save(fileName);
  }

private:
  QLabel *preview;
  QProgressBar *progressBar;
  QPushButton *scan;
  QPushButton *save;
  QProcess *process;
  QImage image;
};

int main(int argc, char **argv)
{
  QApplication app(argc, argv);
  app.setApplicationName("Simple Scan");
  MainWindow main;
  main.show();
  return app.exec();
}

#include "main.moc"

Pour compiler, installez Qt 4, créez un dossier nommé SimpleScan, copiez le code dans un fichier nommé "main.cpp", lancez "qmake -project && qmake && make" et c'est fini.

Document Actions