【VBA】写真・画像の明るさやコントラストを一括で変更するサンプルコード(範囲指定可)

このページでは、Excelに取り込んだ写真や画像について、明るさやコントラストを一括で変更できるサンプルコードを紹介します。

明るさやコントラストを図の書式設定やリボンのメニューから変更しようとすると、ひとつずつしか処理できません。

複数画像を選択すると明るさやコントラストの調整メニューがグレーアウトしてしまいます。

でも、ここに掲載しているサンプルコードを使えば、画像をまとめて処理できます。

コードをコピペして、明るさやコントラストの数値、範囲指定する場合はその範囲を指定するだけで簡単に使うことができるので、ぜひ使ってみてください。

目次

サンプルコード(全画像一括処理)

こちらはアクティブシートの画像すべてに処理をするコードです。

範囲を指定して処理したいときはこの次に紹介するコードをご利用ください。

明るさ

Sub 明るさ一括処理()
'Activeシートすべての画像の明るさを変更

    '◆◆◆◆◆明るさの指定◆◆◆◆◆
    Dim EFTValue As Double
    EFTValue = 0.6 '(暗)0~1.0(明)/中央値0.5

    '=====画像枚数分の処理=====
    Dim i1 As Long
    For i1 = 1 To ActiveSheet.Shapes.Count
        ActiveSheet.Shapes(i1).Select
        Selection.ShapeRange.PictureFormat.Brightness = EFTValue '明るさの変更
    Next i1
        
End Sub

コントラスト

Sub コントラスト一括処理()
'Activeシートすべての画像のコントラストを変更

    '◆◆◆◆◆コントラストの指定◆◆◆◆◆
    Dim EFTValue As Double
    EFTValue = 0.6 '(低)0~1.0(高)/中央値0.5

    '=====画像枚数分の処理=====
    Dim i1 As Long
    For i1 = 1 To ActiveSheet.Shapes.Count
        ActiveSheet.Shapes(i1).Select
        Selection.ShapeRange.PictureFormat.Contrast = EFTValue 'コントラストの変更
    Next i1
        
End Sub

サンプルコード(処理範囲指定)

こちらは処理範囲を指定して(絞って)処理をする場合のコードです。

明るさ

Sub 明るさ一括処理_範囲指定()
'Activeシートのうち指定範囲内の画像の明るさを変更

    '=====変数宣言=====
    Dim EFTValue As Double
    Dim ProcRng As Range
    
    '◆◆◆◆◆ユーザー指定部分◆◆◆◆◆
    '明るさの指定
    EFTValue = 0.6 '(暗)0~1.0(明)/中央値0.5
    
    '処理範囲指定
    Set ProcRng = ActiveSheet.Range("A1:I13") 'この範囲内の画像のみ処理

    '=====範囲内の画像に処理=====
    Dim Img As Object
    For Each Img In ActiveSheet.Shapes
        If Not Intersect(ActiveSheet.Range(Img.TopLeftCell, Img.BottomRightCell), ProcRng) Is Nothing Then
            Img.PictureFormat.Brightness = EFTValue '明るさの変更
        End If
    Next Img
        
End Sub

コントラスト

Sub コントラスト一括処理_範囲指定()
'Activeシートのうち指定範囲内の画像のコントラストを変更

    '=====変数宣言=====
    Dim EFTValue As Double
    Dim ProcRng As Range
    
    '◆◆◆◆◆ユーザー指定部分◆◆◆◆◆
    '明るさの指定
    EFTValue = 0.6 '(低)0~1.0(高)/中央値0.5
    
    '処理範囲指定
    Set ProcRng = ActiveSheet.Range("A1:I13") 'この範囲内の画像のみ処理

    '=====範囲内の画像に処理=====
    Dim Img As Object
    For Each Img In ActiveSheet.Shapes
        If Not Intersect(ActiveSheet.Range(Img.TopLeftCell, Img.BottomRightCell), ProcRng) Is Nothing Then
            Img.PictureFormat.Contrast = EFTValue 'コントラストの変更
        End If
    Next Img
        
End Sub

明るさ・コントラストの指定方法

明るさ、コントラストの変更値の指定方法についてはコード内のコメントを見ていただければわかると思いますが、念のため簡単に解説しておきます。

明るさ、コントラストとも、値は「EFTValue」という変数に次のように指定します。

EFTValue = 0.6 ‘(暗・低)0~1.0(明・高)/中央値0.5

範囲は0~1.0で、明るさで言うと、0で真っ黒に、1.0で真っ白になります。

例に示した0.6という値は、120%の明るさに変更するということです。

なお、標準(画像を取得した時点)の値は「0.5」です。元に戻したいときは「EFTValue = 0.5」と指定して実行すればOKです。

ちなみに、図の書式設定メニューでは%で表記されていて、0を中央値(取得した時点の値)として、明るさで言えば-100%が真っ黒、+100%が真っ白となります。

EFTValueの値を%に換算すると次のようになるのでご参考ください。

EFTValue図の書式設定
0-100%
0.1-80%
0.2-60%
0.3-40%
0.4-20%
0.50%
0.620%
0.740%
0.860%
0.980%
1.0100%

わざわざ記載するまでもないですね…。

処理範囲の指定方法

処理範囲は「ProcRng」という変数に指定していて、変更するのは次の赤字の部分です。

Set ProcRng = ActiveSheet.Range(“A1:I13“)

この赤字の部分を処理したい画像があるセル範囲に変更してください。

画像の左上の角から、右下の角までがしっかり入るように範囲指定するのがポイントです。

なお、「ActiveSheet.」の部分について、この変数だけを変更すると、他の部分と整合性が合わなくなってしまいます。

よくわからない方は触らないようにしてください。

もちろん、特定のシートで実行するようにしたい場合は、コード全体の「ActiveSheet.」を「Sheet1.」などで置き換えればいいだけです。

わかる方は好きに変更して試してみてください。

まとめ

今回は、明るさとコントラストについて、シート全体、または範囲を指定して一括処理するコードを記載させていただきました。

ひとつ注意点として、ここで紹介したコードはすべて、アクティブシートで実行されるように記述しています。

そのため、処理したいシートが選択されている状態(アクティブになっている)かどうか、しっかりと確認してから実行するようにしてください。

また、シャープネス処理についてもサンプルコードを紹介しています。

興味があれば下のリンクからどうぞ。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次