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

 
(同じ利用者による、間の3版が非表示)
76行目: 76行目:
<br>
<br>
  <syntaxhighlight lang="c++">
  <syntaxhighlight lang="c++">
// ImageResizer.hファイル
  #include <QImage>
  #include <QImage>
  #include <QSize>
  #include <QSize>
#include <QFileInfo>
   
   
  class ImageResizer
  int main()
  {
  {
private:
     // 入力ファイルの存在確認
     // エラーメッセージを保存する変数
     if (!QFileInfo::exists("input.jpg")) return -1;
     QString m_lastError;
   
   
     // エラーメッセージを設定するヘルパーメソッド
     // 画像の読み込み
     void setError(const QString &error)
     QImage image("input.jpg");
    {
     if (image.isNull()) return -1;
      m_lastError = error;
     }
public:
    ImageResizer() {};
    ~ImageResizer() {};
   
   
     // 画像の拡大
     // 画像の拡大
     bool resizeImage(const QString &inputPath, const QString &outputPath, const QSize &newSize)
     QImage resizedImage = image.scaled(QSize(800, 600), Qt::KeepAspectRatio, Qt::SmoothTransformation);
    {
      // 入力ファイルの存在確認
      if (!QFileInfo::exists(inputPath)) {
          setError("入力ファイルが存在しない: " + inputPath);
          return false;
      }
   
   
      // 画像の読み込み
    // 拡大した画像の保存
      QImage image(inputPath);
    if (!resizedImage.save("output.jpg")) return -1;
      if (image.isNull()) {
          setError("画像の読み込みに失敗: " + inputPath);
          return false;
      }
   
   
      // 画像の拡大
    return 0;
      QImage resizedImage = image.scaled(newSize, Qt::KeepAspectRatio, Qt::SmoothTransformation);
}
</syntaxhighlight>
<br>
==== 画像の縮小 ====
以下の例では、QImageクラスを使用して、指定された最大サイズ (: 400x300ピクセル) に収まるように縮小する。<br>
元の画像が既このサイズ以下の場合は、縮小処理は行わない。<br>
<br>
<syntaxhighlight lang="c++">
#include <QImage>
#include <QSize>
#include <QFileInfo>
   
   
      // 拡大した画像の保存
QImage shrinkImage(QImage &image, int maxWidth, int maxHeight)
      if (!resizedImage.save(outputPath)) {
{
          setError("拡大した画像の保存に失敗: " + outputPath);
    QSize originalSize = image.size();
          return false;
    QSize newSize      = originalSize;
      }
   
   
       return true;
    // アスペクト比を維持しながら、指定された最大サイズに収まるように縮小
    if (originalSize.width() > maxWidth || originalSize.height() > maxHeight) {
       newSize.scale(maxWidth, maxHeight, Qt::KeepAspectRatio);
     }
     }
   
   
public:
    // 元のサイズより小さい場合のみ縮小を行う
     // エラーメッセージの取得
     // 縮小の必要がない場合は元の画像をそのまま
     QString lastError() const
     if (newSize != originalSize) {
     {
      return image.scaled(newSize, Qt::KeepAspectRatio, Qt::SmoothTransformation);
       return m_lastError;
    }
     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>
  </syntaxhighlight>
<br>
==== 画像の回転 ====
以下の例では、QImageクラスを使用して、画像を回転している。<br>
<br>
<br>
  <syntaxhighlight lang="c++">
  <syntaxhighlight lang="c++">
  // main.cppファイル
  #include <QApplication>
#include <QImage>
#include <QTransform>
#include <QFileDialog>
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
   
   
#include "ImageResizer.h"
    // 画像を読み込む
    QImage image("input.jpg");
    if (image.isNull()) return -1;
   
   
int main()
    // 回転角度を指定 (例: 90度)
  {
    double angle = 90.0;
     ImageResizer resizer;
   
     QString inputPath  = "input.jpg";
     // QTransformクラスを使用して画像を回転
     QString outputPath = "output.jpg";
    QTransform transform;
     QSize newSize(800, 600);
     transform.rotate(angle);
     QImage rotatedImage = image.transformed(transform, Qt::SmoothTransformation);
     if (rotatedImage.isNull()) return -1;
   
   
     if (resizer.resizeImage(inputPath, outputPath, newSize)) {
    // 回転した画像を保存
      qDebug() << "画像の拡大に成功";
     if (!rotatedImage.save("output.jpg")) return -1;
    }
    else {
      qDebug() << "エラー:" << resizer.lastError();
    }
   
   
     return 0;
     return 0;
637行目: 660行目:
<br><br>
<br><br>


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


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