ExcelVBA=エクセルマクロで作成されたゲームやフリーソフトのプログラムソースコードを公開しています。
プログラムソースコード館>実用ソフト>エクセル画forBMP
Option Explicit
Option Base 1
Public FileOpenFlag As Boolean 'ファイルを開く処理中フラグ
Private MakeFlag As Boolean 'ファイルが指定されているフラグ
Private FileName As String '対象ファイルのパス
Private DataBuf() As Byte 'ファイルのバイナリー収容配列
Private TrimRange1 As Range 'トリムパターン指定反映セル
Private TrimRange2 As Range 'トリムパターン結果反映セル
Public TrimFlagRange As Range
Private XpRange As Range '
Private YpRange As Range '
Private StartXpRange As Range
Private LastXpRange As Range
Private StartYpRange As Range
Private LastYpRange As Range
Private TrimXpRange As Range
Private TrimYpRange As Range
Private TrimFlagX As Boolean 'トリムXの必要フラッグ
Private TrimFlagY As Boolean 'トリムYの必要フラッグ
Private XP As Long '画像の横ピクセル
Private Yp As Long '画像の縦ピクセル
Private StartXp As Long 'トリム用座標
Private LastXp As Long
Private StartYp As Long
Private LastYp As Long
Private R() As Byte
Private G() As Byte
Private B() As Byte
Sub SetRange()
Set TrimRange1 = Range("p11")
Set TrimRange2 = Range("p12")
Set TrimFlagRange = Range("G13")
Set XpRange = Range("g10")
Set YpRange = Range("g11")
Set StartXpRange = Range("g17")
Set LastXpRange = Range("i17")
Set StartYpRange = Range("g18")
Set LastYpRange = Range("i18")
Set TrimXpRange = Range("m17")
Set TrimYpRange = Range("m18")
End Sub
Sub ImageTrim()
'トリムの計算
TrimFlagX = (XP > 255)
TrimFlagY = (Yp > 255)
If TrimFlagX = True Or TrimFlagY = True Then
TrimFlagRange.Value = "あり"
ActiveSheet.Image1.PictureAlignment = TrimRange1.Value - 1
Else
TrimFlagRange.Value = "なし"
ActiveSheet.Image1.PictureAlignment = 2
TrimRange1.Value = 3
End If
If TrimFlagX = True Then
Select Case TrimRange1.Value
Case 1 '左上
StartXp = 1
LastXp = 255
Case 2 '右上
StartXp = XP - 255 + 1
LastXp = XP
Case 3 '中央
StartXp = Int((XP - 255) / 2)
LastXp = StartXp + 254
Case 4 '左下
StartXp = 1
LastXp = 255
Case 5 '右下
StartXp = XP - 255 + 1
LastXp = XP
End Select
Else
StartXp = 1
LastXp = XP
End If
If TrimFlagY = True Then
Select Case TrimRange1.Value
Case 1 '左上
StartYp = 1
LastYp = 255
Case 2 '右上
StartYp = 1
LastYp = 255
Case 3 '中央
StartYp = Int((Yp - 255) / 2)
LastYp = StartYp + 254
Case 4 '左下
StartYp = Yp - 255 + 1
LastYp = Yp
Case 5 '右下
StartYp = Yp - 255 + 1
LastYp = Yp
End Select
Else
StartYp = 1
LastYp = Yp
End If
StartXpRange.Value = StartXp
LastXpRange.Value = LastXp
StartYpRange.Value = StartYp
LastYpRange.Value = LastYp
TrimXpRange.Value = LastXp - StartXp + 1
TrimYpRange.Value = LastYp - StartYp + 1
End Sub
Sub FileOpen()
'BMPデータ構造
' 19 横画数下位バイト
' 20 横画数上位バイト
' 23 縦画数下位バイト
' 24 縦画数上位バイト
'55 色データ開始
'55 R
'56 G
'57 B
'1ラインの終わりには4の倍数に合わせ00が入る」
'データは左下→右下
' 左上→右上
On Error GoTo ErrHnd
Dim x As Long
Dim y As Long
Dim DWcount As Byte
Dim count As Long
Dim count2 As Long
SetRange
FileOpenFlag = True
FileName = Application.GetOpenFilename("ビットマップファイル (*.bmp), *.bmp")
'If FileName = False Then
' Exit Sub
If FileLen(FileName) > 0 Then
ReDim DataBuf(1 To FileLen(FileName)) As Byte
End If
MakeFlag = True
Open FileName For Binary As #1
Get #1, , DataBuf
Close #1
If DataBuf(29) <> 24 Then
MsgBox "24bitのBMPのみ対応です"
Exit Sub
End If
'画像横画数
XP = DataBuf(20) * 256 + DataBuf(19)
Yp = DataBuf(24) * 256 + DataBuf(23)
XpRange.Value = XP
YpRange.Value = Yp
'MsgBox x & "×" & y
If XP > 255 Then
MsgBox "縦横255dotまで有効です"
End If
Select Case ((XP * 3) Mod 4)
Case 0
DWcount = 0
Case 1
DWcount = 3
Case 2
DWcount = 2
Case 3
DWcount = 1
End Select
ReDim R(1 To Yp, 1 To XP) As Byte
ReDim G(1 To Yp, 1 To XP) As Byte
ReDim B(1 To Yp, 1 To XP) As Byte
For y = Yp To 1 Step -1
For x = 1 To XP
count = (y - 1) * (XP * 3 + DWcount)
count2 = (x - 1) * 3 + 54
B(Yp + 1 - y, x) = DataBuf(count + count2 + 1)
G(Yp + 1 - y, x) = DataBuf(count + count2 + 2)
R(Yp + 1 - y, x) = DataBuf(count + count2 + 3)
Next x
Next y
ImageTrim
ActiveSheet.Image1.Picture = LoadPicture(FileName)
FileOpenFlag = False
ErrHnd:
Exit Sub
End Sub
Sub MakeSheet()
If MakeFlag = False Then
MsgBox "24bitのBMPファイルを選択して下さい。"
Exit Sub
End If
Dim x As Long
Dim y As Long
Workbooks.Add
Range(Cells(1, 1), Cells(LastYp - StartYp + 1, LastXp - StartXp + 1)).Select
Selection.ColumnWidth = 1.63
Selection.RowHeight = 13.5
Application.ScreenUpdating = False
ActiveWindow.Zoom = True
Application.ScreenUpdating = False
Range("A1").Select
For y = StartYp To LastYp
For x = StartXp To LastXp
Cells(y - StartYp + 1, x - StartXp + 1).Interior.Color = RGB(R(y, x), G(y, x), B(y, x))
Next x
Application.ScreenUpdating = True
Application.ScreenUpdating = False
Next y
MsgBox "エクセル画が完成しました"
End Sub
Sub Clear()
End Sub
プログラムソースコード館>実用ソフト>エクセル画forBMP