概要
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, ¶ms);
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とアプリケーション