画像の垂直(水平)反転処理の方法

投稿者:アーク <info_nds-labo あっとまーくexcite.co.jp> 投稿日:2018/09/06(Thu) 23:19:22 No.2222

お世話になります。アークです。

No.2220の質問が一応自己解決したので、
それを実際に使ってみました。

キャンバス部品には回転させる機能は有るのですが、
反転機能が内容でしたので自己流で遣ってみました。
-------------------------------------------------------
画像加工機を表示する
待機する

画像加工機とは
  ウィンドウを継承する
  はじめの手順
    初期化する
    //貼り付けた部品に対する操作をここに書きます
  終わり
  初期化する手順
  //自動生成された手順です。ここにプログラムを書き加えても消える場合があります
  この背景色を「灰」に変える
  この内部領域大きさを{500,524}に変える
  この種類を「ダイアログ」に変える
  この最大化ボタンを×に変える
  この最小化ボタンを×に変える
  この初期位置を「中央」に変える
  この内容を「フリップ テスト」に変える
  メニュー1というメニューを作る
    その位置と大きさを{0,0,500,24}に変える
    その内容を「メニュー1」に変える
    その移動順を3に変える
    その背景色を「白」に変える
    ファイルメニューというメニュー項目をメニュー1へ追加する
      その表示を○に変える
      その内容を「ファイル」に変える
      処理開始というメニュー項目をメニュー1のファイルメニューへ追加する
        その内容を「反転する...」に変える
      終了というメニュー項目をメニュー1のファイルメニューへ追加する
        その内容を「終了」に変える
  キャンバス1というキャンバスを作る
    その位置と大きさを{0,25,500,500}に変える
終わり

  閉じる時の手順
    終了する
  終わり

  処理開始がクリックされた時の手順
    反転する
  終わり

  終了がクリックされた時の手順
    閉じる
  終わり
  
  反転する時の手順
    画像(「[プログラムの位置]Sample.png」)を作って、画像データとする
    画素配列は、{}
    列画素配列は、{}
    列番号を0から増やしながら499まで繰り返す
      行番号を0から増やしながら499まで繰り返す
        マウス座標を{列番号, 499-行番号}に変える
        色素情報は、画像データにてマウス座標から色を取得したもの
        列画素配列へ色素情報を追加する
      繰り返し終わり
      画素配列へ列画素配列を追加する
      列画素配列は、{}
    繰り返し終わり

    行番号を1から増やしながら500まで繰り返す
      列番号を1から増やしながら500まで繰り返す
        色素情報は、画素配列(列番号, 行番号)の内容
        図形描画によって、キャンバス1の{列番号, 行番号}へ点を「[色素情報]」色で描く
      繰り返し終わり
      0.1秒待つ
    繰り返し終わり
    警告音を鳴らす
  終わり

終わり
-------------------------------------------------------------------

最初の二重ループで画像の色情報を天地反転して置いて、
次の二重ループで描き直しています。
一応、垂直反転した画像が得られましたが処理に数分掛かりました。
また、輝度情報が無いのか白っちゃけてしまいました。

この様な目的の為にはどのような処理が相応しいのでしょうか。

Re: 画像の垂直(水平)反転処理の方法

投稿者:通りすがり 投稿日:2018/09/08(Sat) 09:40:04 No.2223

プロデルデザイナの、機能タブから見ると、画像を回転する命令っぽいものはあるようです。

命令が無い前提とすると、可能ならば.Net Frameworkの機能を調べて、機能が存在するようならドットネット系の命令で利用するのが良いと思います。ほしい機能が汎用的なものであるのであれば、要望として挙げるのも1つの手だと思います。
(今回の機能であれば、System.Drawing.Image(か、それを継承しているSystem.Drawing.Bitmap)の、RotateFlipが該当しそうです。プロデルの回転の命令もこの機能を使用しているっぽい動きをしてますね)

以下、パラメータに対してどう動くのか確認するためのプログラムです。
最初の行の画像ファイル名は書き換えてください。
以下の2つの命令があるようです。有効なパラメータを手当たり次第に調べてたら時間かかりました(リファレンスに載ってない?)
・Flip/Mirrorができない代わりに、細かい角度指定が可能で、新たに生成された画像が返られる命令。
・Flip/Mirrorと回転が同時に行える代わりに、90度単位(0,90,180,270)でしか回転できず、元の画像自身が変更される命令。回転角度を0にすれば、Flip/Mirrorの効果だけ使うことも可能。
 ※文字列引数に右回転とか時計回りと書きたくなるのですが、回転方向ではなく、Flip/Mirror方向を指定するようです。
-------------------
【画像ファイル名:文字列】は、「d:\nako\cap_black.png」
メイン画面を表示
待機
終了

メイン画面とは
 ウィンドウを継承
 ではじめの手順
  この幅は、340
  この内容は、「画像方向で回転するです」
  画像1という画像(画像ファイル名)を作る
  選択リスト1という選択リストを作る
   その位置と大きさは、{0,0,60,20}
   その入力可能は、×
   それへ{0,90,180,270,999}を一括追加する
  選択リスト2という選択リストを作る
   その位置と大きさは、{70,0,100,20}
   その入力可能は、×
   それへ{「水平方向」,「垂直方向」,「水平垂直方向」,「回転」,「でたらめ」,「省略」}を一括追加する
  テキスト1というテキストを作る
   その位置と大きさは、{0,20,300,20}
   その読み取り専用は、○
  ボタン1というボタンを作る
   その位置と大きさは、{0,40,60,24}
   その内容は、「適用!」
  ピクチャー1というピクチャーを作る
   その位置は、{0,70}

  命令を更新する
  ピクチャー1の画像は、画像1
 終わり
 命令を更新する手順
  もし、テキスト1<>無なら、
   もし、選択リスト2の内容=「省略」なら、
    テキスト1の内容は、「画像方向で画像1を[選択リスト1の内容]だけ回転する」
   違えば、
    テキスト1の内容は、「画像方向で画像1を[選択リスト1の内容]だけ[「][選択リスト2の内容][」]へ回転する」
   もし終わり
  もし終わり
 終わり
 選択リスト1が変更された時の手順
  命令を更新する
 終わり
 選択リスト2が変更された時の手順
  命令を更新する
 終わり
 ボタン1がクリックされた時の手順
  もし、選択リスト2の内容=「省略」なら、
   '元画像は変化しない。回転した画像が返却される。
   画像1は、画像1を(選択リスト1の内容)だけ画像方向で回転する
  違えば、
   '元画像が回転する。さらに、元画像自身が返される。
   画像1は、画像1を(選択リスト1の内容)だけ(選択リスト2の内容)へ画像方向で回転する
  もし終わり
  ピクチャー1の画像は、画像1
 終わり
終わり
-----
もし、ロジックで行うのでしたら、半分の高さor幅までのループで点の色を入れ替えながら処理するとよいと思います。また、画像に対して、色を取得することと、(色を)設定することが可能なので、この機能で画像自体を参照しながら書き換えるのが良いかと思います。

ありがとうございます

投稿者:アーク <info_nds-labo あっとまーくexcite.co.jp> 投稿日:2018/09/08(Sat) 12:19:21 No.2226

通りすがりさん、こんにちは。アークです。

サンプルコード、ありがとうございます。
希望する処理が一瞬で終わるのを確認しました。

画像の回転にこの様なパラメータが有ったとは…。
「画像方向」というプロパティが良く分かりませんが、
色情報ではなく直接画素自体を入れ替えているのですね。
私も本当は画素自体を入れ替えたかったのですが、
画素の扱い方が分かりませんでした。

サンプルコードはプロデルのマニュアル等に記載されていない機能を、
類推と検証で引き出したという事ですね。
凄いとしか言いようが有りません。

〉半分の高さor幅までのループで点の色を入れ替えながら処理するとよいと思います。
取得と設定を同時に行うという事でしょうか。

〉画像に対して、色を取得することと、(色を)設定することが可能なので、
〉この機能で画像自体を参照しながら書き換えるのが良いかと思います。
確かに「画像」の処に有りますね。見落としていました。
こちらの方法も試してみたのですが取得はできても設定でエラーになりました。

目から鱗のコード、ありがとうございました。
自分なりに消化してから使わせていただきます。

▲ページの先頭へ

- WebForum -