GDI+绘不同图片不同文字,结果大小不同,请教。

苦苦的潜行者 2015-05-10 12:13:24
GDI+批量不同图片上添加不同文字水印
不同图片,但图片都是900x600,不同文字,但文字大小都是设置的new font(“黑体”,20)
结果出来的效果就是有一部分图片文字大好多,一部分文字小好多。
用measurestring测量也得出一样的结果,一个大,一个小。
请问这是为什么。
对比





提示框中用g.measurestring测出来的width和height,果然是不一样的,一个45,一个24

求可能的原因。
...全文
323 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
苦苦的潜行者 2015-05-13
  • 打赏
  • 举报
回复
引用 9 楼 Tiger_Zhao 的回复:
搞什么鬼。 你说大小固定为900x600吗? 难道你PictureBox1的大小还不是900x600?又要按图片原始大小来了!
是900x600,但是有些是600x900,不好意思。。。 按照你的思路,重新修改的,现在可以了。多谢。
Tiger_Zhao 2015-05-12
  • 打赏
  • 举报
回复
搞什么鬼。
你说大小固定为900x600吗?
难道你PictureBox1的大小还不是900x600?又要按图片原始大小来了!
苦苦的潜行者 2015-05-12
  • 打赏
  • 举报
回复
引用 4 楼 Tiger_Zhao 的回复:
应该说图片没拉伸才对。
    Private Sub AddText(ByVal Path As String, ByVal bh As String, ByVal Name As String, ByVal newPath As String, ByVal fnt As Font, ByVal colr As SolidBrush, ByVal aX As Long, ByVal aY As Long, ByVal aRbtn As Integer)
        Dim fileImg As Image = Image.FromFile(Path) '<- 这个大小不确定'

        Dim img As New System.Drawing.Bitmap(PictureBox1.Width, PictureBox1.Height)
        Dim g As Graphics = Graphics.FromImage(img)
        g.CompositingQuality = CompositingQuality.HighQuality
        g.SmoothingMode = SmoothingMode.HighQuality
        g.InterpolationMode = InterpolationMode.HighQualityBicubic

        'Dim s = g.MeasureString(Name, fnt)
        'MsgBox(s.Width & "  " & s.Height)

        g.DrawImage(fileImg, New Rectangle(0, 0, PictureBox1.Width, PictureBox1.Height)) '<- 拉伸'
        g.DrawString(Name, fnt, colr, New PointF(aX, aY))
        PictureBox1.Image = New Bitmap(img)
        PictureBox1.Refresh()

        If Not SaveImage(img, newPath & "\" & bh & ".jpg", "JPEG") Then
            img.Save(newPath & "\" & bh & ".jpg") '<- 格式不对会影响显示吧,不会出问题?'
        End If

        fileImg.Dispose()
        g.Dispose()
        img.Dispose()
    End Sub
解决核心问题, 不错,层主直接指定所有图片按照picturebox大小绘制,出来的图片都被强制大小了。 所以要按图片的大小绘制画布/绘图就可以了。 不过还是感谢@Tiger_Zhao 贴上代码。
        Dim fileImg As Image = Image.FromFile(Path) '<- 这个大小不确定'
        Dim img As New System.Drawing.Bitmap(fileImg.Width, fileImg.Height) '按照图片大小,初始化画布
        Dim g As Graphics = Graphics.FromImage(img)

        '因为图片大小不确定不能按照picturebox去初始化画布
        'PictureBox1.Image = Image.FromFile(Path)

        'Dim img As System.Drawing.Bitmap = PictureBox1.Image
        'Dim g As Graphics = Graphics.FromImage(img)

        g.CompositingQuality = CompositingQuality.HighQuality
        g.SmoothingMode = SmoothingMode.HighQuality
        g.InterpolationMode = InterpolationMode.HighQualityBicubic

        '绘图
        g.DrawImage(fileImg, New Rectangle(0, 0, img.Width, img.Height)) '<- 拉伸'
        '绘文字
        g.DrawString(Name, fnt, New SolidBrush(newForeColor), New PointF(aX, aY))


        PictureBox1.Image = New Bitmap(img)
        PictureBox1.Refresh()

        '无损压缩
        If Not SaveImage(img, newPath & "\" & bh & ".jpg", "JPEG") Then
            '如果不匹配“JPEG”格式,不进行无损压缩,强制保存为jpg格式。
            img.Save(newPath & "\" & bh & ".jpg")
        End If

        g.Dispose()
        img.Dispose()
        fileImg.Dispose()
Tiger_Zhao 2015-05-11
  • 打赏
  • 举报
回复
应该说图片没拉伸才对。
    Private Sub AddText(ByVal Path As String, ByVal bh As String, ByVal Name As String, ByVal newPath As String, ByVal fnt As Font, ByVal colr As SolidBrush, ByVal aX As Long, ByVal aY As Long, ByVal aRbtn As Integer)
Dim fileImg As Image = Image.FromFile(Path) '<- 这个大小不确定'

Dim img As New System.Drawing.Bitmap(PictureBox1.Width, PictureBox1.Height)
Dim g As Graphics = Graphics.FromImage(img)
g.CompositingQuality = CompositingQuality.HighQuality
g.SmoothingMode = SmoothingMode.HighQuality
g.InterpolationMode = InterpolationMode.HighQualityBicubic

'Dim s = g.MeasureString(Name, fnt)
'MsgBox(s.Width & " " & s.Height)

g.DrawImage(fileImg, New Rectangle(0, 0, PictureBox1.Width, PictureBox1.Height)) '<- 拉伸'
g.DrawString(Name, fnt, colr, New PointF(aX, aY))
PictureBox1.Image = New Bitmap(img)
PictureBox1.Refresh()

If Not SaveImage(img, newPath & "\" & bh & ".jpg", "JPEG") Then
img.Save(newPath & "\" & bh & ".jpg") '<- 格式不对会影响显示吧,不会出问题?'
End If

fileImg.Dispose()
g.Dispose()
img.Dispose()
End Sub
wjq 2015-05-11
  • 打赏
  • 举报
回复
批量处理怎么还用到picturebox。猜测可能是dpi/分辨率不一样导致的。 首先,不要用ui控件去批量处理图片,又慢又可能误导你自己。 直接用Image/Bitmap去加载你的图片文件,直接看他们的Size/PhysicalDimension 是不是一样。 如果确实有区别,你另外去new一个Bitmap对象,然后用DrawImage方法把原图绘制到新的Bitmap上,然后在上面DrawString
本拉灯 2015-05-11
  • 打赏
  • 举报
回复
引用 5 楼 xiaolinyouni 的回复:
[quote=引用 3 楼 wyd1520 的回复:] 显示的问题吧,图片被拉申了?
我感觉可能也是,我设置的PictureBox1.SizeMode = PictureBoxSizeMode.Zoom 但是我就算是去掉或者改成autosize也是一样。[/quote] 你应改成None才是。
苦苦的潜行者 2015-05-11
  • 打赏
  • 举报
回复
引用 3 楼 wyd1520 的回复:
显示的问题吧,图片被拉申了?
我感觉可能也是,我设置的PictureBox1.SizeMode = PictureBoxSizeMode.Zoom 但是我就算是去掉或者改成autosize也是一样。
本拉灯 2015-05-10
  • 打赏
  • 举报
回复
显示的问题吧,图片被拉申了?
苦苦的潜行者 2015-05-10
  • 打赏
  • 举报
回复
代码


    Private Sub AddText(Path As String, bh As String, Name As String, newPath As String, fnt As Font, colr As SolidBrush, aX As Long, aY As Long, aRbtn As Integer)
        PictureBox1.Image = Image.FromFile(Path)

        Dim img As System.Drawing.Bitmap = PictureBox1.Image
        Dim g As Graphics = Graphics.FromImage(img)
        g.CompositingQuality = CompositingQuality.HighQuality
        g.SmoothingMode = SmoothingMode.HighQuality
        g.InterpolationMode = InterpolationMode.HighQualityBicubic

        'Dim s = g.MeasureString(Name, fnt)
        'MsgBox(s.Width & "  " & s.Height)

        g.DrawString(Name, fnt, colr, New PointF(aX, aY))
        PictureBox1.Image = New Bitmap(img)
        PictureBox1.Refresh()

        '无损压缩
        If Not SaveImage(img, newPath & "\" & bh & ".jpg", "JPEG") Then
            '如果不匹配“JPEG”格式,不进行无损压缩,强制保存为jpg格式。
            img.Save(newPath & "\" & bh & ".jpg")
        End If

        g.Dispose()
        img.Dispose()
    End Sub

苦苦的潜行者 2015-05-10
  • 打赏
  • 举报
回复
求大神啊。。。。。。。

16,554

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧