ひとりも見捨てないことを、あきらめない

学校教育、社会教育、数学、技術家庭科、Youtube、EdTech、ICT、プログラミング、その他

画像を切り取るのは、意外に面倒くさい  01/05 日

 あたえられた画像があって、「ある範囲の部分を切り取って、別のところに貼り付ける」という作業は、しばしば行う作業だと思います。図面でも、イラストでも、地図でも、「一部を切り取る」というのは、ごく普通のことだと思います。

 ところが、プログラムでこのことを実行しようとすると、「C#」という言語の場合には、意外に面倒な作業になってしますので、びっくりしてしまいました。

 通常は、プログラムで画像を扱う場合には、「もともとの画像を読み込んで表示して終わり」という場合が多いので、これをさらに加工しようとすると、面倒な手続きが必要になります。

 プログラミングというものを考えるときの参考になるだろうと思うので、以下に、手続きを書いておきます(あいまいな表現を、わざと使っています)。

  1. 画像を読み込むための場所を確保する
  2. その場所に画像を読み込む
    ⇒ 読み込んだものは、表示することも可能です
  3. 読み込んだ画像に対して「これから処理しますよぉ」ということを宣言しておく。
  4. 宣言するだけでなく、実際に処理するための道具も用意する。
  5. 処理した結果を格納するための場所を別途用意する
  6. 元の画像に対して、「道具」を用いて画像を処理し、結果を新しい場所に保存する。

以上のような作業の流れになります。

 これらは、「画像を処理するだけ」の内容なので、処理前の画像や、処理後の画像を表示させるのは、別の作業になります。

 具体的には、「この画像を、この場所に表示させる。表示させるときの大きさはこうする」みたいなことを、ひとつひとつ教えてあげないと表示してくれません。

 一応、処理の内容について、具体的にプログラミング言語を用いて書いておきます。

// 元の画像を pic という場所に表示させる
PictureBox pic = new PictureBox();
pic.Location = new Point(10, 10);
pic.Size = new Size(500, 300);
pic.Image = Image.FromFile("data.png");
Controls.Add(pic);

// 元のイメージを切り取って、im1 に貼り付ける
im1 = new Bitmap(300, 70);
Graphics g = Graphics.FromImage(im1);
Rectangle srcRect = new Rectangle(90, 80, 300, 70);
Rectangle desRect = new Rectangle(0, 0, 300, 70);
g.DrawImage(pic.Image, desRect, srcRect, GraphicsUnit.Pixel);
g.Dispose();

// im1 を pic1 に表示させる
PictureBox pic1 = new PictureBox();
pic1.Location = new Point(10, 350);
pic1.Size = new Size(300, 70);
pic1.Image = im1;
Controls.Add(pic1);

// 元のイメージを切り取って、im2 に貼り付ける
im2 = new Bitmap(300, 70);
g = Graphics.FromImage(im2);
srcRect = new Rectangle(90, 180, 300, 70);
desRect = new Rectangle(0, 0, 300, 70);
g.DrawImage(pic.Image, desRect, srcRect, GraphicsUnit.Pixel);
g.Dispose();

// im2 を pic2 に表示させる
PictureBox pic2 = new PictureBox();
pic2.Location = new Point(10, 450);
pic2.Size = new Size(300, 70);
pic2.Image = im2;
Controls.Add(pic2);

// 以上で、im1, im2 に画像データが格納されたことが確認できた。

f:id:takase_hiroyuki:20191123160855p:plain