表題の通り。苦戦した。
以下のコードは、テキストボックスにランダムに表示した5000文字の文字データをキャプチャして、G4圧縮TIFFを作成する処理を指定回数繰り返すというツールの一部抜粋。コメントとかはまたいつか整備します。
Private Sub CreateButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CreateButton.Click
Dim builder As StringBuilder
Dim rndNumber As Integer
Dim rndChar As Char
For count As Integer = 1 To CInt(ImageCount.Text)
Dim memoryImage As Bitmap
builder = New StringBuilder
For i As Integer = 1 To 5000
'ランダムな文字を追加
rndNumber = CInt(Int( (122 - 32 + 1) * Rnd() + 32) )
rndChar = Chr(rndNumber)
builder.Append(rndChar)
Next
ResultText.Clear()
ResultText.Text = builder.ToString
Me.Refresh()
Dim g As Graphics = Me.CreateGraphics()
Dim img As Bitmap = New Bitmap(Me.Size.Width, Me.Size.Height, g)
Dim memoryGraphics As Graphics = Graphics.FromImage(img)
Dim dc1 As IntPtr = g.GetHdc()
Dim dc2 As IntPtr = memoryGraphics.GetHdc()
BitBlt(dc2, 0, 0, _
Me.ClientRectangle.Width, Me.ClientRectangle.Height, _
dc1, 0, 0, 13369376)
g.ReleaseHdc(dc1)
memoryGraphics.ReleaseHdc(dc2)
System.Windows.Forms.Application.DoEvents()
'lock the bits of the original bitmap
Dim bmdo As BitmapData = img.LockBits(New Rectangle(0, 0, img.Width, img.Height), ImageLockMode.ReadOnly, img.PixelFormat)
'and the new 1bpp bitmap
bm = New Bitmap(img.Width, img.Height, PixelFormat.Format1bppIndexed)
Dim bmdn As BitmapData = bm.LockBits(New Rectangle(0, 0, bm.Width, bm.Height), ImageLockMode.ReadWrite, PixelFormat.Format1bppIndexed)
'scan through the pixels Y by X
Dim y As Integer
For y = 0 To img.Height - 1
Dim x As Integer
For x = 0 To img.Width - 1
'generate the address of the colour pixel
Dim index As Integer = y * bmdo.Stride + x * 4
'check its brightness
If Color.FromArgb(Marshal.ReadByte(bmdo.Scan0, index + 2), Marshal.ReadByte(bmdo.Scan0, index + 1), Marshal.ReadByte(bmdo.Scan0, index)).GetBrightness() > 0.5F Then
Me.SetIndexedPixel(x, y, bmdn, True) 'set it if its bright.
End If
Next x
Next y
'tidy up
bm.UnlockBits(bmdn)
img.UnlockBits(bmdo)
'ファイル名確定と書き出し
Dim fileName As String
fileName = "c:\Temp2\" & CStr(count) & ".tif"
Dim enc As New System.Drawing.Imaging.EncoderParameters(2)
Dim codec As System.Drawing.Imaging.ImageCodecInfo = GetEncoderInfo("image/tiff")
enc.Param(0) = New Imaging.EncoderParameter(Imaging.Encoder.ColorDepth, 1L)
enc.Param(1) = New Imaging.EncoderParameter(Imaging.Encoder.Compression, EncoderValue.CompressionCCITT4)
bm.Save(fileName, codec, enc)
Next
End Sub 'pictureBox1_Click
Private Shared Function GetEncoderInfo(ByVal mineType As String) _
As System.Drawing.Imaging.ImageCodecInfo
'GDI+ に組み込まれたイメージ エンコーダに関する情報をすべて取得
Dim myEncoders() As System.Drawing.Imaging.ImageCodecInfo = _
System.Drawing.Imaging.ImageCodecInfo.GetImageEncoders()
'指定されたMimeTypeを探して見つかれば返す
Dim myEncoder As System.Drawing.Imaging.ImageCodecInfo
For Each myEncoder In myEncoders
If myEncoder.MimeType = mineType Then
Return myEncoder
End If
Next
Return Nothing
End Function
参考文献:
- GotDotNetJapan掲示板「VB.NET:テキストファイルをTIFFファイルに印刷」:
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?forum=7&topic=9688 - GotDotNet掲示板「Best Practice for Creating Multi-Page Tiffs」:
http://www.gotdotnet.com/Community/MessageBoard/Thread.aspx?id=235164 - BobPowell .NET「Converting an RGB image to 1 bit-per-pixel monochrome.」:
http://www.bobpowell.net/onebit.htm - dobon.net「Bitmapオブジェクトのファイル出力(G4圧縮TIFF形式)について」:
http://dobon.net/vb/bbs/log3-3/1509.html