版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。
问题描述:
画40000个正方形,填充颜色,让它们的颜色从黑色(0,0,0)逐渐变化到白色(255,255,255),这个过程总共变化256次
写了几种解决方法,似乎处理任然很慢:
方法1:wuganxiu的原代码
Dim x(0 To 199) As Integer
Dim y(0 To 199) As Integer
Dim R1 = 255
Dim G1 = 255
Dim B1 = 255
Dim bgimage As Bitmap '将这个位图对象关联到图片框的Image属性
Dim bggriphic As Graphics '以后绘图时,只需要在这个位图对象上绘制即可,图片框会自动重绘的
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim time_start As DateTime = Now
Dim i, j, i2 As Integer
bgimage = New Bitmap(PictureBox1.Width, PictureBox1.Height) '创建相同大小的内存位图
bggriphic = Graphics.FromImage(bgimage)
PictureBox1.Image = bgimage
TextBox1.Text = ""
For i = 0 To 199
x(i) = i * 12
y(i) = i * 12
Next
For i2 = 0 To 255
R1 = i2
G1 = i2
B1 = i2
For i = 0 To 199
For j = 0 To 199
Dim MyBrush1 As New SolidBrush(Color.FromArgb(R1, G1, B1))
bggriphic.FillRectangle(MyBrush1, x(i), y(j), 10, 10)
Next
Next
PictureBox1.Refresh()
Next
Dim time_end As DateTime = Now
Dim tspan As New TimeSpan()
tspan = time_end - time_start
TextBox1.Text = tspan.TotalMilliseconds.ToString
End Sub
方法2:
Imports System.Drawing.Imaging
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
Dim time_start As DateTime = Now
Dim i, j As Integer
Dim sourceImg As Bitmap
sourceImg = New Bitmap(PictureBox1.Width, PictureBox1.Height) '创建相同大小的内存位图
bggriphic = Graphics.FromImage(sourceImg)
TextBox1.Text = ""
For i = 0 To 199
x(i) = i * 12
y(i) = i * 12
Next
R1 = 255
G1 = 255
B1 = 255
For i = 0 To 199
For j = 0 To 199
Dim MyBrush1 As New SolidBrush(Color.FromArgb(R1, G1, B1))
bggriphic.FillRectangle(MyBrush1, x(i), y(j), 10, 10)
Next
Next
PictureBox1.Image = sourceImg
PictureBox1.Refresh()
Dim i2 As Single
i2 = 1 / 255
'矩阵
Dim imageAttributes As New ImageAttributes()
Dim k As Integer
For k = 0 To 255
Dim w As Single
w = i2 * k
Dim imgMatrixElement()() As Single = {
New Single() {0, 0, 0, 0, 0},
New Single() {0, 0, 0, 0, 0},
New Single() {0, 0, 0, 0, 0},
New Single() {0, 0, 0, 1, 0},
New Single() {w, w, w, 0, 0}
}
Dim imgMatrix As New ColorMatrix(imgMatrixElement)
imageAttributes.SetColorMatrix(imgMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap)
Dim destImg As New Bitmap(sourceImg.Width, sourceImg.Height)
Dim g As Graphics = Graphics.FromImage(destImg)
g.DrawImage(sourceImg, New Rectangle(0, 0, sourceImg.Width, sourceImg.Height), 0, 0, sourceImg.Width, sourceImg.Height,
GraphicsUnit.Pixel, imageAttributes)
PictureBox1.Image = destImg
PictureBox1.Refresh()
Next
Dim time_end As DateTime = Now
Dim tspan As New TimeSpan()
tspan = time_end - time_start
TextBox1.Text = tspan.TotalMilliseconds.ToString
End Sub
方法3:
Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
Dim time_start As DateTime = Now
Dim sourceImg As New Bitmap(PictureBox1.Width, PictureBox1.Height)
Dim sourceGraphic As Graphics = Graphics.FromImage(sourceImg)
Dim pos(199) As Integer
For l As Integer = 0 To 199
pos(l) = l * 12
Next
Dim k As Integer
For k = 0 To 255
For i As Integer = 0 To 199
For j As Integer = 0 To 199
Dim MyBrush1 As New SolidBrush(Color.FromArgb(k, k, k))
sourceGraphic.FillRectangle(MyBrush1, pos(i), pos(j), 10, 10)
Next
Next
'Dim destImg As Bitmap = sourceImg.Clone
PictureBox1.Image = sourceImg
PictureBox1.Refresh()
Next
Dim time_end As DateTime = Now
Dim tspan As New TimeSpan()
tspan = time_end - time_start
TextBox1.Text = tspan.TotalMilliseconds.ToString
End Sub
方法4:
Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
Dim time_start As DateTime = Now
Dim sourceImg As New Bitmap(PictureBox1.Width, PictureBox1.Height)
Dim sourceGraphic As Graphics = Graphics.FromImage(sourceImg)
Dim pos(199) As Integer
For l As Integer = 0 To 199
pos(l) = l * 12
Next
Dim k As Integer
For k = 0 To 255
For i As Integer = 0 To 199
For j As Integer = 0 To 199
Dim MyBrush1 As New SolidBrush(Color.FromArgb(k, k, k))
sourceGraphic.FillRectangle(MyBrush1, pos(i), pos(j), 10, 10)
Next
Next
Dim destGraphic As Graphics = PictureBox1.CreateGraphics
destGraphic.DrawImage(sourceImg, New Point(0, 0))
'PictureBox1.Refresh()
Next
Dim time_end As DateTime = Now
Dim tspan As New TimeSpan()
tspan = time_end - time_start
TextBox1.Text = tspan.TotalMilliseconds.ToString
End Sub
方法5:
Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click
Dim time_start As DateTime = Now
Dim pos(199) As Integer
For l As Integer = 0 To 199
pos(l) = l * 12
Next
Dim sourceImg As New Bitmap(10, 10)
Dim sourceGraphic As Graphics = Graphics.FromImage(sourceImg)
For i As Integer = 0 To 255
Dim fillBrush As New SolidBrush(Color.FromArgb(i, i, i))
sourceGraphic.FillRectangle(fillBrush, New Rectangle(0, 0, sourceImg.Width, sourceImg.Height))
Dim destImg As New Bitmap(PictureBox1.Width, PictureBox1.Height)
Dim destGraphic As Graphics = Graphics.FromImage(destImg)
For j As Integer = 0 To 199
For k As Integer = 0 To 199
destGraphic.DrawImage(sourceImg, New Point(pos(j), pos(k)))
Next
Next
PictureBox1.Image = destImg
PictureBox1.Refresh()
destGraphic.Dispose()
Next
Dim time_end As DateTime = Now
Dim tspan As New TimeSpan()
tspan = time_end - time_start
TextBox1.Text = tspan.TotalMilliseconds.ToString
End Sub
以上5个方法的速度对比:
方法1:7828.9485
方法2:7907.0448
方法3:7766.4385
方法4:10079.1807
方法5:6590.5865
总的来看,还是很慢。