最後に、ビットマップ形式の画像データを読み取るVisual Basicのソースコードを掲載します。「Visual Basic 2010」で動作確認済みです。62〜68行目が注意点となります。このソースコードは、Windows 3.1マシンの16bit版Visual Basicで作ったものですが、画像データ1行分のバイト数が4バイト(つまり32bit)の整数倍になるようにしてあります。すぐにWindowsが32bit化されることを見越して、データ構造を設計していたわけです。
Option Explicit On
Imports System.Math
Public Class Form1
Structure FileHeader
Dim Type1 As Byte
Dim Type2 As Byte
Dim Size As Integer
Dim Reserved1 As Short
Dim Reserved2 As Short
Dim OffBits As Integer
End Structure
Public BitmapFileHeader As FileHeader
Structure InfoHeader
Dim Size As Integer
Dim Width As Integer
Dim Height As Integer
Dim Planes As Short
Dim BitCount As Short
Dim Compression As Integer
Dim SizeImage As Integer
Dim XPelsPerMeter As Integer
Dim YPelsPerMeter As Integer
Dim ClrUsed As Integer
Dim ClrImportant As Integer
End Structure
Public BitmapInfoHeader As InfoHeader
Public rmap(257, 257) As Byte 'RGB data
Public gmap(257, 257) As Byte
Public bmap(257, 257) As Byte
Public buf() As Byte
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
End Sub
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
Dim iv, k4, i, k, ih, width3 As Integer
Dim ih3 As Integer
Dim flen As Integer
Dim s As String
Dim ier As Integer
Dim map_n As String
map_n = "c:\Temp\test_image.bmp"
ier = 1
On Error GoTo Read_mapdata_Er
flen = CInt(FileLen(map_n))
FileOpen(1, map_n, OpenMode.Binary)
FileGet(1, BitmapFileHeader, 1)
FileGet(1, BitmapInfoHeader)
If BitmapInfoHeader.BitCount <> 24 Then
MsgBox("BitmapInfoHeader.BitCount=" & CStr(BitmapInfoHeader.BitCount), 0, "Mapping data file must be 24bit BMPfile.")
GoTo read_mapdata_close_f
End If
width3 = BitmapInfoHeader.Width * 3
k = width3 Mod 4
If k = 0 Then
k4 = width3
Else
k4 = width3 + 4 - k
End If
ReDim buf(k4 - 1)
For iv = BitmapInfoHeader.Height To 1 Step -1
If EOF(1) Then MsgBox("Filename " & map_n, 0, "Error in Reading mapping data.") : GoTo read_mapdata_close_f
FileGet(1, buf)
For ih = 1 To BitmapInfoHeader.Width
ih3 = ih * 3
bmap(ih, iv) = buf(ih3 - 3)
gmap(ih, iv) = buf(ih3 - 2)
rmap(ih, iv) = buf(ih3 - 1)
Next ih
Next iv
FileClose(1)
ier = 0
Exit Sub
read_mapdata_close_f:
FileClose(1)
Exit Sub
Read_mapdata_Er:
FileClose(1)
s = Err.Description & vbCrLf
MsgBox(s, 16, "Error at read_mapdata")
End Sub
高橋 良一(たかはし りょういち)
RTデザインラボ 代表
1961年生まれ。技術士(機械部門)、計算力学技術者 上級アナリスト、米MIT Francis Bitter Magnet Laboratory 元研究員。
構造・熱流体系のCAE専門家と機械設計者の両面を持つエンジニア。約40年間、大手電機メーカーにて医用画像診断装置(MRI装置)の電磁振動・騒音の解析、測定、低減設計、二次電池製造ラインの静音化、液晶パネル製造装置の設計、CTスキャナー用X線発生管の設計、超音波溶接機の振動解析と疲労寿命予測、超電導磁石の電磁振動に対する疲労強度評価、メカトロニクス機器の数値シミュレーションの実用化などに従事。現在RTデザインラボにて、受託CAE解析、設計者解析の導入コンサルティングを手掛けている。⇒ RTデザインラボ
直動パーツフィーダー不具合をばね−マス系で読み解く
共振はなぜ起きる? ばね−マス系と伝達関数で考える
ストップ! 外注丸投げ――CAE解析や冷却系の設計を自分でやれるようになろう
連載「CAEを正しく使い疲労強度計算と有機的につなげる」の内容と有限要素法
解析専任者に連絡する前に、設計者がやるべきこと
設計者なら一度はやってみたい形状最適化、お金をかけずにどこまでできる?Copyright © ITmedia, Inc. All Rights Reserved.
メカ設計の記事ランキング