📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

 
(同じ利用者による、間の5版が非表示)
69行目: 69行目:
<br>
<br>
これらのクラスを使い分けることにより、効率的で柔軟な画像処理と表示が可能になる。<br>
これらのクラスを使い分けることにより、効率的で柔軟な画像処理と表示が可能になる。<br>
<br><br>
== QImageクラスの使用例 ==
==== 画像の拡大 ====
以下の例では、QImageクラスを使用して、画像を拡大している。<br>
<br>
<syntaxhighlight lang="c++">
#include <QImage>
#include <QSize>
#include <QFileInfo>
int main()
{
    // 入力ファイルの存在確認
    if (!QFileInfo::exists("input.jpg")) return -1;
    // 画像の読み込み
    QImage image("input.jpg");
    if (image.isNull()) return -1;
    // 画像の拡大
    QImage resizedImage = image.scaled(QSize(800, 600), Qt::KeepAspectRatio, Qt::SmoothTransformation);
    // 拡大した画像の保存
    if (!resizedImage.save("output.jpg")) return -1;
    return 0;
}
</syntaxhighlight>
<br>
==== 画像の縮小 ====
以下の例では、QImageクラスを使用して、指定された最大サイズ (例: 400x300ピクセル) に収まるように縮小する。<br>
元の画像が既このサイズ以下の場合は、縮小処理は行わない。<br>
<br>
<syntaxhighlight lang="c++">
#include <QImage>
#include <QSize>
#include <QFileInfo>
QImage shrinkImage(QImage &image, int maxWidth, int maxHeight)
{
    QSize originalSize = image.size();
    QSize newSize      = originalSize;
    // アスペクト比を維持しながら、指定された最大サイズに収まるように縮小
    if (originalSize.width() > maxWidth || originalSize.height() > maxHeight) {
      newSize.scale(maxWidth, maxHeight, Qt::KeepAspectRatio);
    }
    // 元のサイズより小さい場合のみ縮小を行う
    // 縮小の必要がない場合は元の画像をそのまま
    if (newSize != originalSize) {
      return image.scaled(newSize, Qt::KeepAspectRatio, Qt::SmoothTransformation);
    }
    else {
      return image;
    }
}
int main()
{
    // 入力ファイルの存在確認
    if (!QFileInfo::exists("input.jpg")) return -1;
    // 画像の読み込み
    QImage image("input.jpg");
    if (image.isNull()) return -1;
    // 画像の縮小
    QImage resizedImage = shrinkImage(image, 400, 300)
    // 縮小した画像の保存
    if (!resizedImage.save("output.jpg")) return -1;
    return 0;
}
</syntaxhighlight>
<br>
==== 画像の回転 ====
以下の例では、QImageクラスを使用して、画像を回転している。<br>
<br>
<syntaxhighlight lang="c++">
#include <QApplication>
#include <QImage>
#include <QTransform>
#include <QFileDialog>
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    // 画像を読み込む
    QImage image("input.jpg");
    if (image.isNull()) return -1;
    // 回転角度を指定 (例: 90度)
    double angle = 90.0;
    // QTransformクラスを使用して画像を回転
    QTransform transform;
    transform.rotate(angle);
    QImage rotatedImage = image.transformed(transform, Qt::SmoothTransformation);
    if (rotatedImage.isNull()) return -1;
    // 回転した画像を保存
    if (!rotatedImage.save("output.jpg")) return -1;
    return 0;
}
</syntaxhighlight>
<br><br>
<br><br>


472行目: 582行目:
  };
  };
  </syntaxhighlight>
  </syntaxhighlight>
<br>
==== モノクロパターン生成器 ====
以下の例では、ランダムなモノクロパターンを生成し表示するウィジェットクラスを定義している。<br>
<br>
<syntaxhighlight lang="c++">
// MonochromePatternGenerator.hファイル
#include <QWidget>
#include <QBitmap>
#include <QPainter>
#include <QPushButton>
#include <QVBoxLayout>
#include <QLabel>
#include <QRandomGenerator>
#include <QMessageBox>
class MonochromePatternGenerator : public QWidget
{
    Q_OBJECT
private:
    QLabel      *patternLabel;    // パターン表示用ラベル
    QPushButton *generateButton;  // パターン生成ボタン
public:
    // コンストラクタ: ウィジェットの初期化を行います
    MonochromePatternGenerator(QWidget *parent = nullptr) : QWidget(parent)
    {
      // パターン表示用ラベル
      patternLabel = new QLabel(this);
      patternLabel->setAlignment(Qt::AlignCenter);
      // パターン生成ボタン
      generateButton = new QPushButton("新しいパターンを生成", this);
      connect(generateButton, &QPushButton::clicked, this, &MonochromePatternGenerator::generatePattern);
      // レイアウトの設定
      QVBoxLayout *layout = new QVBoxLayout(this);
      layout->addWidget(patternLabel);
      layout->addWidget(generateButton);
      setLayout(layout);
      // 初期パターンを生成
      generatePattern();
    }
private slots:
    // ランダムなモノクロパターンを生成するスロット
    void generatePattern()
    {
      try {
          // 100x100ピクセルのビットマップを作成
          QBitmap bitmap(100, 100);
          bitmap.fill(Qt::color0);    // 黒で初期化
          QPainter painter(&bitmap);
          painter.setPen(Qt::color1);  // 白で描画
          // ランダムなパターンを生成
          for (int y = 0; y < 100; y++) {
            for (int x = 0; x < 100; x++) {
                if (QRandomGenerator::global()->generateDouble() > 0.5) {
                  painter.drawPoint(x, y);
                }
            }
          }
          // パターンをラベルに表示
          patternLabel->setPixmap(QPixmap::fromImage(bitmap.toImage().scaled(200, 200, Qt::KeepAspectRatio, Qt::FastTransformation)));
      }
      catch (const std::exception& e) {
          QMessageBox::critical(this, "エラー", QString("パターンの生成に失敗: %1").arg(e.what()));
      }
    }
};
</syntaxhighlight>
<br><br>


== QGraphicsViewクラスを使用する ==
== QGraphicsViewクラスの使用 ==
画像を表示する機能を持っているウィジェットは無いため、ビュークラスを継承して派生クラスを作成する。<br>
画像を表示する機能を持っているウィジェットは無いため、ビュークラスを継承して派生クラスを作成する。<br>
(元々、<code>QGraphicsView</code>クラスは、<code>QGraphicsScene</code>クラスを表示するためのものである)<br>
(元々、<code>QGraphicsView</code>クラスは、<code>QGraphicsScene</code>クラスを表示するためのものである)<br>
557行目: 744行目:
  }
  }
  </syntaxhighlight>
  </syntaxhighlight>
<br><br>
<br>
 
==== 画像の拡大・縮小・移動 ====
== 画像の拡大・縮小・移動 ==
画像を表示する機能には、拡大・縮小、移動等の制御が必要になる場合が多い。<br>
画像を表示する機能には、拡大・縮小、移動等の制御が必要になる場合が多い。<br>
これらの機能を実装するには、<code>QTransform</code>クラスを使用する。<br>
これらの機能を実装するには、<code>QTransform</code>クラスを使用する。<br>
698行目: 884行目:
  }
  }
  </syntaxhighlight>
  </syntaxhighlight>
<br><br>
<br>
 
==== 画像のクリック位置の座標を逆算する ====
== 画像のクリック位置の座標を逆算する ==
画像上において、クリックする位置の座標を取得して、ピクセル値を取得する操作がある。<br>
画像上において、クリックする位置の座標を取得して、ピクセル値を取得する操作がある。<br>
<br>
<br>
741行目: 926行目:
  }
  }
  </syntaxhighlight>
  </syntaxhighlight>
<br><br>
<br>
 
==== 拡大・縮小時の画像の解像度を上げる ====
== 拡大・縮小時の画像の解像度を上げる ==
上記のセクション群では、画像を拡大・縮小する場合、画像の解像度はビューポートのサイズのままである。<br>
上記のセクション群では、画像を拡大・縮小する場合、画像の解像度はビューポートのサイズのままである。<br>
また、描画および再描画ごとに表示用の画像を作成しているため非効率である。<br>
また、描画および再描画ごとに表示用の画像を作成しているため非効率である。<br>
857行目: 1,041行目:
  </syntaxhighlight>
  </syntaxhighlight>
<br><br>
<br><br>


__FORCETOC__
__FORCETOC__
[[カテゴリ:Qt]]
[[カテゴリ:Qt]]