画像全体の平均の色を求めるソフト開発 モザイクアート用


スポンサーリンク

はじめに

なぜこのようなソフトを開発しようと思ったかというと、マインクラフトで画像を表現する方法の適切なブロック探しをもう少し簡単にできるようにしたいと思ったからです。原理はとても単純で、全部の画素の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つ画像をダウンロードして参照するのは面倒なので。

ご覧いただきありがとうございました。

last

フォローする