概要



SANE

ライセンス

SANEは、GPL 2、またはそれ以降のバージョン(任意選択)の条項に従って、再配布または改変することができる。

SANEライブラリを使用する場合、特別な例外として、SANEに含まれるライブラリの追加使用を許可する。

この例外は、SANEライブラリを他のファイルとリンクして実行可能ファイルを開発する場合、実行可能ファイルがGPLの対象となるわけではない。
SANEライブラリをリンクしたことを理由に、その実行ファイルの使用が制限されることはない。

SANEライブラリに改変を加える場合、改変にこの例外を適用することを許可するかどうかは、開発者に委ねられる。
それを望まない場合は、ライセンスファイルから例外通知を削除する。

パッケージ管理システムからインストール

# RHEL
sudo dnf install sane-backends-devel sane-backends-devel.i686

# SUSE
sudo zypper install sane-backends-devel sane-backends-devel-32bit 


ソースコードからインストール

SANE-Backendのビルドに必要なライブラリをインストールする。

# SUSE
sudo zypper install autoconf autoconf-archive m4 libtool libcurl-devel libjpeg62-devel libpng16-devel libxml2-devel net-snmp-devel \
                    libavahi-devel libavahi-glib-devel libusb-1_0-devel libusb-compat-devel libpoppler-devel libpoppler-glib-devel libv4l-devel


SANE-Backendの公式Webサイト、または、SANE-BackendのGitLabにアクセスして、ソースコードをダウンロードする。
ダウンロードしたファイルを解凍する。

tar xf sane-backends-<バージョン>.tar.gz
cd sane-backends-<バージョン>


SANE-Backendをビルドおよびインストールする。

./autogen.sh

mkdir build && cd build

../configure --prefix=<SANE-Backendのインストールディレクトリ>
make j $(nproc)
make install


使用例

Qtのプロジェクトファイルを設定する。

 # QImageクラスを使用する場合は、guiを記述する
 QT = core gui
 
 # SANE library.
 LIBS += \
    -lsane \
 
 INCLUDEPATH += \
    /usr/include


以下の例では、SANE backendライブラリを使用してスキャナから画像を取り込んでいる。

 #include <QCoreApplication>
 #include <QImage>
 #include <QFile>
 #include <vector>
 #include <memory>
 #include <sane/sane.h>
 #include <sane/saneopts.h>
 #include <iostream>
 
 
 int main(int argc, char *argv[])
 {
    QCoreApplication a(argc, argv);
 
    // スキャナのハンドルを初期化
    SANE_Int version_code;
    SANE_Status status = sane_init(&version_code, nullptr);
    if (status != SANE_STATUS_GOOD) {
        std::cerr << "SANE init failed: " << sane_strstatus(status) << std::endl;
 
        return -1;
    }
 
    // 全てのデバイス情報を取得
    const SANE_Device **device_list;
    status = sane_get_devices(&device_list, SANE_FALSE);
    if (status != SANE_STATUS_GOOD) {
        sane_exit();
        std::cerr << "SANE get devices failed: " << sane_strstatus(status) << std::endl;
 
        return -1;
    }
 
    // ここでは、1番目のデバイスを使用する
    if (device_list[0] == nullptr) {
        sane_exit();
        std::cerr << "No SANE devices found." << std::endl;
 
        return -1;
    }
 
    // 使用するスキャナを決定
    SANE_Handle scanner;
    status = sane_open(device_list[0]->name, &scanner);
    if (status != SANE_STATUS_GOOD) {
        sane_exit();
        std::cerr << "SANE open failed: " << sane_strstatus(status) << std::endl;
 
        return -1;
    }
 
    // スキャナのオプションを設定
    status = sane_start(scanner);
    if (status != SANE_STATUS_GOOD) {
        sane_close(scanner);
        sane_exit();
        std::cerr << "SANE start failed: " << sane_strstatus(status) << std::endl;
 
        return -1;
    }
 
    SANE_Parameters params;
    status = sane_get_parameters(scanner, &params);
    if (status != SANE_STATUS_GOOD) {
        sane_close(scanner);
        sane_exit();
        std::cerr << "Failed to get scan parameters: " << sane_strstatus(status) << std::endl;
 
        return -1;
    }
 
    // 画像データの保存先
    QFile File("output.ppm");
    if (!File.open(QIODevice::WriteOnly)) {
        std::cerr << "Failed to open file for writing." << std::endl;
        sane_close(scanner);
        sane_exit();
 
        return -1;
    }
 
    // スマートポインタを使用する場合
    //std::unique_ptr<unsigned char[]> buffer = std::make_unique<unsigned char[]>(params.bytes_per_line * params.lines);
 
    // vectorクラスを使用する場合
    std::vector<unsigned char> buffer(params.bytes_per_line * params.lines);
 
    try {
        // PPMヘッダ情報を書き込む
        QString header = QString("P6\n%1 %2\n255\n").arg(params.pixels_per_line).arg(params.lines);
        File.write(header.toUtf8());
 
        // 画像をスキャン
        do {
            SANE_Int numRead = 0;
 
            // スマートポインタを使用する場合
            //status = sane_read(scanner, buffer.get(), params.bytes_per_line * params.lines, &numRead);
 
            // vectorクラスを使用する場合
            status = sane_read(scanner, buffer.data(), buffer.size(), &numRead);
 
            if (status != SANE_STATUS_EOF && status != SANE_STATUS_GOOD) {
                std::cerr << "Failed to read data" << std::endl;
                File.close();
 
                return -1;
            }
 
            // スマートポインタを使用する場合
            //File.write(reinterpret_cast<const char*>(buffer.get()), numRead);
 
            // vectorクラスを使用する場合
            File.write(reinterpret_cast<const char*>(buffer.data()), numRead);
        } while (status != SANE_STATUS_EOF);
    }
    catch (const std::exception &e) {
        std::cerr << e.what() << std::endl;
    }
 
    File.close();
 
    // PNG形式に変換
    QImage image("output.ppm");
    if (!image.load("output.ppm")) {
        std::cerr << "Could not read PPM image." << std::endl;
    }
 
    if (!image.save("output.png", "PNG")) {
        std::cerr << "Could not convert PNG image." << std::endl;
    }
 
    sane_close(scanner);
    sane_exit();
 
    std::cout << "Scan complete." << std::endl;
 
    return 0;
 }



KSaneを使用する場合

KSaneのインストール

パッケージ管理システムからインストール
# SUSE
sudo zypper install ksanecore-devel libksane-devel


ソースコードからインストール

libksaneのGithubにアクセスして、ソースコードをダウンロードする。
ダウンロードしたファイルを解凍する。

tar xf libksane-<バージョン>.tar.gz
cd libksane-<バージョン>


libksaneのビルドに必要なライブラリをインストールする。

sudo zypper install make cmake extra-cmake-modules \
                    kguiaddons-devel kio-devel kxmlgui-devel kwidgetsaddons-devel ktextwidgets-devel kwallet-devel ki18n-devel ksanecore-devel \
                    libQt5Core-devel libQt5Widgets-devel libQt5Test-devel  # Qt 5を使用する場合
                    qt6-core-devel qt6-widgets-devel qt6-test-devel        # Qt 6を使用する場合


libksaneをビルドおよびインストールする。

mkdir build && cd build

cmake .. \
      -DCMAKE_C_COMPILER=<GCC 8以降のgccのパス> -DCMAKE_CXX_COMPILER=<G++ 8以降のg++のパス> \
      -DCMAKE_BUILD_TYPE=Release                          \
      -DCMAKE_INSTALL_PREFIX=<libksaneのインストールディレクトリ> \
      -DQT_MAJOR_VERSION=5  # 不要の可能性あり (Qt 5を使用する場合)
      -DQT_MAJOR_VERSION=6  # 不要の可能性あり (Qt 6を使用する場合)
make -j $(nproc)
make install



TWAIN 2

有志のGithubにアクセスして、TWAIN 2を使用したサンプルソースコードがダウンロードできる。
このサンプルのライセンスは、修正BSDライセンスである。

  • ソフトウェアのみの仮想スキャナ
  • クロスプラットフォームTWAIN DSとアプリケーション