0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

vbsの作法 その20

Last updated at Posted at 2018-11-22

概要

vbsの作法調べてみた。
bmpファイル作ってみた。

写真

image

サンプルコード

Dim objPALT
Dim objPALTImage
ForWriting = 2
Set objPALT = New Palette
objPALT.SetProperties 16, 5
objPALT.SetColor 0, 0, 0, 0, 0
objPALT.SetColor 1, 215, 215, 215, 0
objPALT.SetColor 3, 255, 255, 255, 0
Set objPALTImage = New Image
objPALTImage.SetProperties 256, 256, 8
For i = 0 To 256
	For j = 0 To 256
		if (i - 128) * (i - 128) + (j - 128) * (j - 128) < 5000 Then
			objPALTImage.SetPixel i, j, 15
		End if
	Next
Next
objPALTImage.ExportToBMP "C:\test.bmp", objPALT
msgbox "ok"



Class StringBuilder
	Dim arr
	Dim growthRate
	Dim itemCount
	Private Sub Class_Initialize()
		growthRate = 50
		itemCount = 0
		ReDim arr(growthRate)
	End Sub
	Public Sub Append(ByVal strValue)
		If itemCount > UBound(arr) Then
			ReDim Preserve arr(UBound(arr) + growthRate)
		End If
		arr(itemCount) = strValue
		itemCount = itemCount + 1
	End Sub
	Public Function ToString()
		ToString = Join(arr, "")
	End Function
End Class

Class Palette
	Private intNumberOfColors
	Private intBitsPerComponent
	Private arrData()
	Private Sub Class_Initialize()
		intNumberOfColors = 0
		intBitsPerComponent = 0
	End Sub
	Public Function SetProperties(pintNumberOfColors, pintBitsPerComponent)
		intNumberOfColors = pintNumberOfColors
		intBitsPerComponent = pintBitsPerComponent
		ReDim arrData(pintNumberOfColors - 1, 3)
		Randomize 314159265
		Dim intIndex
		For intIndex = 0 To pintNumberOfColors - 1
			Int(Rnd * (2^pintBitsPerComponent))
			arrData(intIndex, 0) = Int(Rnd * (2 ^ pintBitsPerComponent))
			arrData(intIndex, 1) = Int(Rnd * (2 ^ pintBitsPerComponent))
			arrData(intIndex, 2) = Int(Rnd * (2 ^ pintBitsPerComponent))
			arrData(intIndex, 3) = 0
		Next
	End Function
	Public Function SetColor(pintColorIndex, pintRed, pintGreen, pintBlue, pintAlpha)
		If (pintColorIndex >= 0) And (pintColorIndex < intNumberOfColors) Then
			arrData(pintColorIndex, 0) = pintRed
			arrData(pintColorIndex, 1) = pintGreen
			arrData(pintColorIndex, 2) = pintBlue
			arrData(pintColorIndex, 3) = pintAlpha
		End If
	End Function
	Public Property Get NumberOfColors
		NumberOfColors = intNumberOfColors
	End Property
	Public Property Get MaximumComponentValue
		MaximumComponentValue = intBitsPerComponent
	End Property
	Public Function GetBMPData
		Dim intIndex
		For intIndex = 0 To intNumberOfColors - 1
			GetBMPData = GetBMPData & Chr(arrData(intIndex, 2) * 255 \ (2 ^ intBitsPerComponent - 1)) & Chr(arrData(intIndex, 1) * 255 \ (2 ^ intBitsPerComponent - 1)) & Chr(arrData(intIndex, 0) * 255 \ (2^intBitsPerComponent - 1)) & Chr(arrData(intIndex, 3))
		Next
	End Function
End Class

Class Image
	Private intWidth
	Private intHeight
	Private intBitDepth
	Private arrData()
	Private Sub Class_Initialize()
		intWidth = 0
		intHeight = 0
		intBitDepth = 0
	End Sub
	Public Function SetProperties(pintWidth, pintHeight, pintBitDepth)
		SetProperties = False
		If (pintWidth > 0) And (pintHeight > 0) And ((pintBitDepth = 4) Or (pintBitDepth = 8) Or (pintBitDepth = 24)) Then
			intWidth = pintWidth
			intHeight = pintHeight
			intBitDepth = pintBitDepth
			ReDim arrData(pintWidth * pintHeight - 1)
			Dim i
			For i = 0 To UBound(arrData)
				arrData(i) = 0
			Next
			SetProperties = True
		End If
	End Function
	Public Property Get Width
		Width = intWidth
	End Property
	Public Property Get Height
		Height = intHeight
	End Property
	Public Property Get BitDepth
		BitDepth = intBitDepth
	End Property
	Public Function SetPixel(pintX, pintY, pintValue)
		SetPixel = False
		If (pintX >= 0) And (pintX <= intWidth - 1) And (pintY >= 0) And (pintY <= intHeight - 1) And (pintValue <= 2 ^ intBitDepth - 1) Then
			arrData(pintY * intWidth + pintX) = pintValue
			SetPixel = True
		End If
	End Function
	Public Function GetPixel(pintX, pintY)
		GetPixel = 0
		If (pintX >= 0) And (pintX <= intWidth - 1) And (pintY >= 0) And (pintY <= intHeight - 1) Then
			GetPixel = arrData(pintY * intWidth + pintX)
		End If
	End Function
	Public Function PutImage(pintX, pintY, pImage, pblnHorizontalFlip, pblnVerticalFlip)
		PutImage = False
		If (pintX >= 0) And (pintX + pImage.Width <= intWidth) And (pintY >= 0) And (pintY + pImage.Height <= intHeight) Then
			Dim x, y, tmpVal
			For y = 0 To pImage.Height - 1
				tmpVal = (pintY + y) * intWidth + pintX
				For x = 0 To pImage.Width - 1
					If pblnHorizontalFlip Then
						If pblnVerticalFlip Then
							arrData(tmpVal + x) = pImage.GetPixel(pImage.Width - 1 - x, pImage.Height - 1 - y)
						Else
							arrData(tmpVal + x) = pImage.GetPixel(pImage.Width - 1 - x, y)
						End If
					Else
						If pblnVerticalFlip Then
							arrData(tmpVal + x) = pImage.GetPixel(x, pImage.Height - 1 - y)
						Else
							arrData(tmpVal + x) = pImage.GetPixel(x, y)
						End If
					End If
				Next
			Next
			PutImage = True
		End If
	End Function
	Public Function ExportToBMP(pstrFileName, pobjPalette)
		Dim intLinePadding, intImageOffset, intBitmapSize, strBMPData, intNumberOfColors
		intLinePadding = (intWidth * intBitDepth)
		If intLinePadding >= 32 Then
			intLinePadding = intLinePadding Mod 32
			If intLinePadding <> 0 Then
				intLinePadding = 32 - intLinePadding
			End If
		Else
			intLinePadding = 32 - intLinePadding
		End If
		If intBitDepth <> 24 Then
			intNumberOfColors = pobjPalette.NumberOfColors
		Else
			intNumberOfColors = 0
		End If
		intImageOffset = 54 + 4 * intNumberOfColors
		intBitmapSize = ((intWidth * intBitDepth) + intLinePadding) * intHeight / 8
		strBMPData = "BM"
		strBMPData = strBMPData & IntToString(intImageOffset + intBitmapSize)
		strBMPData = strBMPData & Chr(0) & Chr(0)
		strBMPData = strBMPData & Chr(0) & Chr(0)
		strBMPData = strBMPData & IntToString(intImageOffset)
		strBMPData = strBMPData & Chr(40) & Chr(0) & Chr(0) & Chr(0)
		strBMPData = strBMPData & IntToString(intWidth)
		strBMPData = strBMPData & IntToString(intHeight)
		strBMPData = strBMPData & Chr(1) & Chr(0)
		strBMPData = strBMPData & Chr(intBitDepth) & Chr(0)
		strBMPData = strBMPData & Chr(0) & Chr(0) & Chr(0) & Chr(0)
		strBMPData = strBMPData & IntToString(intBitmapSize)
		strBMPData = strBMPData & Chr(&h13) & Chr(&h0B) & Chr(0) & Chr(0)
		strBMPData = strBMPData & Chr(&h13) & Chr(&h0B) & Chr(0) & Chr(0)
		strBMPData = strBMPData & IntToString(intNumberOfColors)
		strBMPData = strBMPData & IntToString(intNumberOfColors)
		If intBitDepth <> 24 Then
			strBMPData = strBMPData & pobjPalette.GetBMPData
		End If
		Dim intX, intY, intIndex, objStringBuilder
		Set objStringBuilder = New StringBuilder
		objStringBuilder.Append strBMPData
		Select Case intBitDepth
			Case 4
				Dim intByte, intNumberOfNibbles
				intLinePadding = intLinePadding \ 4
				intNumberOfNibbles = 0
				intByte = 0
				For intY = intHeight - 1 To 0 Step -1
					For intX = 0 To intWidth - 1
						intByte = intByte * 16 + arrData(intY * intWidth + intX)
						intNumberOfNibbles = intNumberOfNibbles + 1
						If intNumberOfNibbles = 2 Then
							objStringBuilder.Append Chr(intByte)
							intByte = 0
							intNumberOfNibbles = 0
						End If
					Next
					If intLinePadding <> 0 Then
						For intIndex = 0 To intLinePadding - 1
							intByte = intByte * 16 + 0
							intNumberOfNibbles = intNumberOfNibbles + 1
							If intNumberOfNibbles = 2 Then
								objStringBuilder.Append Chr(intByte)
								intNumberOfNibbles = 0
							End If
						Next
						If intNumberOfNibbles = 1 Then
							objStringBuilder.Append Chr(intByte * 16)
							intNumberOfNibbles = 0
						End If
					End If
				Next
			Case 8
				intLinePadding = intLinePadding \ 8
				For intY = intHeight - 1 To 0 Step -1
					For intX = 0 To intWidth - 1
						objStringBuilder.Append Chr(arrData(intY * intWidth + intX))
					Next
					If intLinePadding <> 0 Then
						For intIndex = 0 To intLinePadding - 1
							objStringBuilder.Append Chr(0)
						Next
					End If
				Next
			Case 24
				intLinePadding = intLinePadding \ 8
				Dim intPixel
				For intY = intHeight - 1 To 0 Step -1
					For intX = 0 To intWidth - 1
						intPixel = arrData(intY * intWidth + intX)
						objStringBuilder.Append Chr((intPixel \ 65536) And &HFF)
						objStringBuilder.Append Chr((intPixel \ 256) And &HFF)
						objStringBuilder.Append Chr((intPixel) And &HFF)
					Next
					If intLinePadding <> 0 Then
						For intIndex = 0 To intLinePadding - 1
							objStringBuilder.Append Chr(0)
						Next
					End If
				Next
		End Select
		Dim objFileSystemObject
		Set objFileSystemObject = CreateObject("Scripting.FileSystemObject")
		Dim objBMPFile
		Set objBMPFile = objFileSystemObject.OpenTextFile(pstrFileName, ForWriting, True)
		objBMPFile.Write objStringBuilder.ToString
		objBMPFile.Close
	End Function
	Private Function IntToString(pintValue)
		Dim intPart1, intPart2, intPart3, intPart4
		intPart1 = (pintValue And &h000000FF)
		intPart2 = (pintValue \ 256) And &h000000FF
		intPart3 = (pintValue \ 65536) And &h000000FF
		intPart4 = (pintValue \ 16777216) And &h000000FF
		IntToString = Chr(intPart1) & Chr(intPart2) & Chr(intPart3) & Chr(intPart4)
	End Function
	Public Function TextDump
		Dim x, y
		TextDump = ""
		For y = 0 To Height - 1
			For x = 0 To Width - 1
				TextDump = TextDump & arrData(y * intWidth + x)
				If x <> Width - 1 Then
					TextDump = TextDump & vbTab
				End If
			Next
			TextDump = TextDump & vbCrLf
		Next
	End Function
End Class


以上。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?