簡易フォトレタッチソフト第二回

 前回は、処理対象のビットマップを内部にもったBMPパネルコンポーネントを作成しましたが、今回は汎用の32ビットフレームバッファJIntFrameBufferクラスを定義し、そのインスタンスをアプリケーションクラスの方で保持するようにしました。ビットマップを表示するパネルコンポーネントは、アプリケーションからフレームバッファを受け取り、内部のBufferedImageを更新する形になります。

JIntFrameBufferとパネルコンポーネント

 JIntFrameBufferクラスは、今回のフォトレタッチソフトだけでなくJDK1.1でも使えるように汎用的なフレームバッファクラスになっています。といっても、ピクセル列を保持するint型配列とピクセルへのアクセス、BMP読み書き程度のごく基本的な機能しかありませんが。

 ビットマップを表示するパネルコンポーネントの方は、内部に表示するビットマップをJIntFrameBuffer型メンバm_frameとして保持し、表示するビットマップの設定はJIntFrameBuffersetFrameBuffer()に渡して行うようにします。このsetFrameBuffer()では、渡されたビットマップをm_frameにコピーして再描画を行います。

  public void setFrameBuffer(JIntFrameBuffer frm) {

      m_frame.assign(frm);

      if (m_frame.getWidth()!=m_iWidth || m_frame.getHeight()!=m_iHeight)
          setPanelSize(m_frame.getWidth(),m_frame.getHeight());

      updateImage();
      repaint();

  }

 流れとしては、ビットマップをパネルコンポーネントにsetFrameBuffer()で渡して再描画という処理を、表示対象のビットマップを更新する度に行うことになるでしょう。

アプリケーションクラス

 以上のことから、アプリケーションクラスX02Phtの方は処理対象のJIntFrameBuffer型メンバm_frameと、m_frameを表示するためのパネルコンポーネントm_bpを保持するようにします。ファイルからの読み込みや画像処理を行う時は、まずm_frameで処理を行ってその結果更新されたm_framem_bpに渡して再描画するわけです。
 この流れを確認するために、今回はメニューに各ピクセルのXor処理を行うXorを追加しました。このメニューのイベント処理は、以下のようになっています。

  if (e.getSource()==m_miXor) { // Xorメニュー

      int r,g,b;

      // 各ピクセルをXor
      for (int i=0;i<m_frame.getHeight();i++)
          for (int j=0;j<m_frame.getWidth();j++) {

              r=m_frame.getR(j,i);
              g=m_frame.getG(j,i);
              b=m_frame.getB(j,i);

              r=r ^ 0xff;
              g=g ^ 0xff;
              b=b ^ 0xff;

              m_frame.setR(j,i,r);
              m_frame.setG(j,i,g);
              m_frame.setB(j,i,b);

          }

      // パネルコンポーネントをm_frameで更新
      m_bp.setFrameBuffer(m_frame);

  }

 これでビットマップを読み書きしたり画像処理を行ったりその結果を表示したりという「フォトレタッチソフトの骨組み」は完成です。後は、画像処理(今回はXor)の種類を増やしていけばフォトレタッチソフトらしくなっていくでしょう。

プログラム

 今回はjarファイルX02Pht.jarにソースもまとめてあります。

java -jar X02Pht.jar

 として起動し、ファイルの読み書きやXorを試したら、jarファイルの展開ソフトか拡張子をzipに変えてzip展開ソフトで展開してソースファイルを参照してください。

プログラムダウンロード
戻る トップへ