「Qtの基礎 - スキャナ」の版間の差分
ナビゲーションに移動
検索に移動
細 (文字列「__FORCETOC__」を「{{#seo: |title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki |keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,Electric Circuit,Electric,pcb,Mathematics,AVR,TI,STMicro,AVR,ATmega,MSP430,STM,Arduino,Xilinx,FPGA,Verilog,HDL,PinePhone,Pine Phone,Raspberry,Raspberry Pi,C,C++,C#,Qt,Qml,MFC,Shell,Bash,Zsh,Fish,SUSE,SLE,Suse Enterprise,Suse Linux,openSUSE,open SUSE,Leap,Linux,uCLnux,Podman,電気回路,電子回路,基板,プリント基板 |description={{PAGENAME}} - 電子回路とSUSE Linuxに関する情報 | This pag…) |
|||
| (同じ利用者による、間の3版が非表示) | |||
| 3行目: | 3行目: | ||
== SANE == | == SANE == | ||
==== ライセンス ==== | |||
SANEは、GPL 2、またはそれ以降のバージョン(任意選択)の条項に従って、再配布または改変することができる。<br> | |||
<br> | |||
SANEライブラリを使用する場合、特別な例外として、SANEに含まれるライブラリの追加使用を許可する。<br> | |||
<br> | |||
この例外は、SANEライブラリを他のファイルとリンクして実行可能ファイルを開発する場合、実行可能ファイルがGPLの対象となるわけではない。<br> | |||
SANEライブラリをリンクしたことを理由に、その実行ファイルの使用が制限されることはない。<br> | |||
<br> | |||
SANEライブラリに改変を加える場合、改変にこの例外を適用することを許可するかどうかは、開発者に委ねられる。<br> | |||
それを望まない場合は、ライセンスファイルから例外通知を削除する。<br> | |||
<br> | |||
==== パッケージ管理システムからインストール ==== | ==== パッケージ管理システムからインストール ==== | ||
# RHEL | # RHEL | ||
| 14行目: | 25行目: | ||
# SUSE | # SUSE | ||
sudo zypper install autoconf autoconf-archive m4 libtool libcurl-devel libjpeg62-devel libpng16-devel libxml2-devel net-snmp-devel \ | sudo zypper install autoconf autoconf-archive m4 libtool libcurl-devel libjpeg62-devel libpng16-devel libxml2-devel net-snmp-devel \ | ||
libusb-1_0-devel libusb-compat-devel libpoppler-devel libpoppler-glib-devel | libavahi-devel libavahi-glib-devel libusb-1_0-devel libusb-compat-devel libpoppler-devel libpoppler-glib-devel libv4l-devel | ||
<br> | <br> | ||
[http://sane-project.org SANE-Backendの公式Webサイト]、または、[https://gitlab.com/sane-project/backends/-/releases SANE-BackendのGitLab]にアクセスして、ソースコードをダウンロードする。<br> | [http://sane-project.org SANE-Backendの公式Webサイト]、または、[https://gitlab.com/sane-project/backends/-/releases SANE-BackendのGitLab]にアクセスして、ソースコードをダウンロードする。<br> | ||
| 29行目: | 40行目: | ||
make j $(nproc) | make j $(nproc) | ||
make install | make install | ||
<br> | |||
==== 使用例 ==== | |||
Qtのプロジェクトファイルを設定する。<br> | |||
<syntaxhighlight lang="make"> | |||
# QImageクラスを使用する場合は、guiを記述する | |||
QT = core gui | |||
# SANE library. | |||
LIBS += \ | |||
-lsane \ | |||
INCLUDEPATH += \ | |||
/usr/include | |||
</syntaxhighlight> | |||
<br> | |||
以下の例では、SANE backendライブラリを使用してスキャナから画像を取り込んでいる。<br> | |||
<syntaxhighlight lang="c++"> | |||
#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; | |||
} | |||
</syntaxhighlight> | |||
<br><br> | <br><br> | ||
| 70行目: | 238行目: | ||
<br><br> | <br><br> | ||
{{#seo: | |||
|title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki | |||
|keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,Electric Circuit,Electric,pcb,Mathematics,AVR,TI,STMicro,AVR,ATmega,MSP430,STM,Arduino,Xilinx,FPGA,Verilog,HDL,PinePhone,Pine Phone,Raspberry,Raspberry Pi,C,C++,C#,Qt,Qml,MFC,Shell,Bash,Zsh,Fish,SUSE,SLE,Suse Enterprise,Suse Linux,openSUSE,open SUSE,Leap,Linux,uCLnux,Podman,電気回路,電子回路,基板,プリント基板 | |||
|description={{PAGENAME}} - 電子回路とSUSE Linuxに関する情報 | This page is {{PAGENAME}} in our wiki about electronic circuits and SUSE Linux | |||
|image=/resources/assets/MochiuLogo_Single_Blue.png | |||
}} | |||
__FORCETOC__ | __FORCETOC__ | ||
[[カテゴリ:Qt]] | [[カテゴリ:Qt]] | ||
2024年10月14日 (月) 10:58時点における最新版
概要
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とアプリケーション