スポンサーリンク
はじめに
なぜこのようなソフトを開発しようと思ったかというと、マインクラフトで画像を表現する方法の適切なブロック探しをもう少し簡単にできるようにしたいと思ったからです。原理はとても単純で、全部の画素のRGBの値の平均をそれぞれとるだけです。ただこれだけでも、ブロック探しはとても楽になると思います。
画像読み込み
これは以前の記事と同様です。軽く説明すると、画像を参照し、読み込み、RGBの値を1ピクセルごとに取得できる状態にします。
プログラムにする
64bit整数型の変数に、全ピクセルのR,G,Bそれぞれの値を加算していき、最後にピクセル数で割り、その値を表示するだけです。でもそれだけでは面白くないので、実際に色を表示させます。
Public Class Form1
Dim image As Bitmap
Dim h As Integer
Dim w As Integer
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim ofd As New OpenFileDialog()
ofd.FilterIndex = 2
ofd.Title = "画像ファイルを選択してください。"
ofd.RestoreDirectory = True
If ofd.ShowDialog() = DialogResult.OK Then
Dim name = ofd.FileName
Dim bmpPath As String = name
image = Drawing.Image.FromFile(bmpPath)
h = image.Height
w = image.Width
Label1.Text = name
End If
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
If (IsNothing(image)) Then
Return
End If
Dim sumR, sumG, sumB As ULong
sumR = 0
sumG = 0
sumB = 0
Dim a, b As Integer
a = 0
b = 0
For a = 0 To w - 1
For b = 0 To h - 1
sumR += image.GetPixel(a, b).R
sumG += image.GetPixel(a, b).G
sumB += image.GetPixel(a, b).B
Next
Next
Dim resR As Integer = sumR / (w * h)
Dim resG As Integer = sumG / (w * h)
Dim resB As Integer = sumB / (w * h)
Label3.Text = resR.ToString + " " + resG.ToString + " " + resB.ToString
PictureBox1.BackColor = Color.FromArgb(resR, resG, resB)
End Sub
End Class
Formには、Labelを3つ、ボタンを2つ、PictureBox(色の表示領域として)を1つ設置しました。
スポンサーリンク結果
真っ赤なファイルを作成し、読み込ませた結果です。正しく出力されています。それでは
これではどうでしょうか。
こんな感じになりました。だいたい合っていそうです。
プログラムを改良するとしたら…画面の任意の場所を曲線的・直線的に選択できるようにするのがよさそうですね。1つ1つ画像をダウンロードして参照するのは面倒なので。
ご覧いただきありがとうございました。