Как сказал @EmirAkaydin в своем ответе, ваша проблема заключается в интерполяции.Я подозреваю, что его ответ о том, что он имеет высоту всего в один пиксель, противоречит алгоритму изменения размера Microsoft, является правильным.
У меня есть для вас двухэтапное решение.Если вы не хотите писать свой собственный код изменения размера (я не хотел), который изменяет размеры точно так, как вы хотите, вы все равно можете использовать функцию Graphics.DrawImage
, чтобы хотя бы изменить размер width вашего изображения, нотолько ширина.Затем вы можете напрямую манипулировать данными пикселей и копировать каждую эту первую действительную строку для всей высоты изображения.
Вы можете заменить свой код DoDemo
следующим (я не использую VB, поэтомуЯ не уверен насчет стиля кодирования, он работает, однако):
Call CreateSampleImage()
'scale the image to only one single row
Dim bm As New Bitmap(450, 1)
Using gr As Graphics = Graphics.FromImage(bm)
Dim RDst As New Rectangle(0, 0, bm.Width, bm.Height)
Dim RSrc As New Rectangle(0, 0, Me.PictureBox1.Image.Width, Me.PictureBox1.Image.Height)
gr.InterpolationMode = Drawing2D.InterpolationMode.NearestNeighbor
gr.SmoothingMode = Drawing2D.SmoothingMode.None
gr.DrawImage(Me.PictureBox1.Image, RDst, RSrc, GraphicsUnit.Pixel)
End Using
Me.PictureBox2.Image = bm
'stretch now the single row image back to original width
Dim bm2 As New Bitmap(Me.PictureBox1.Image.Width, Me.PictureBox1.Image.Height)
Using gr As Graphics = Graphics.FromImage(bm2)
Dim RDst As New Rectangle(0, 0, bm2.Width, 1)
Dim RSrc As New Rectangle(0, 0, Me.PictureBox2.Image.Width, Me.PictureBox2.Image.Height)
gr.InterpolationMode = Drawing2D.InterpolationMode.NearestNeighbor
gr.SmoothingMode = Drawing2D.SmoothingMode.None
gr.DrawImage(Me.PictureBox2.Image, RDst, RSrc, GraphicsUnit.Pixel)
End Using
' use our own custom height stretch code
Dim rrc As New Rectangle(0, 0, bm2.Width, bm2.Height)
Dim bmd As BitmapData
bmd = bm2.LockBits(rrc, ImageLockMode.ReadWrite, bm2.PixelFormat)
' stride is the width of the image in pixels
Dim ba(bmd.Stride - 1) As Byte
Marshal.Copy(bmd.Scan0, ba, 0, bmd.Stride)
' copy pixel data to each line
For y = 1 To bmd.Height - 1
Marshal.Copy(ba, 0, bmd.Scan0 + (y * bmd.Stride), ba.Length)
Next
bm2.UnlockBits(bmd)
Me.PictureBox3.Image = bm2
РЕДАКТИРОВАТЬ:
Интересно, что опубликованный код @FredrikJohansson также будет работать:
gr.PixelOffsetMode = Drawing2D.PixelOffsetMode.HighQuality
прямо перед тем, как нарисовать изображение.Я оставлю этот код и отвечу здесь, на случай, если кто-нибудь захочет его увидеть, но, похоже, он ответил на ваш вопрос проще:)