Mini programme pour scanner
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:

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.

