干货! 用StretchBlt处理图片,保存后的图片有黑边?

tdlthm tdlthm 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
用 StretchBlt 处理图像有后黑边,
原图如下:

处理后保存的图片如下(处理后的图片超过2M 论坛上传不了,故对图片进行了QQ截图,展示效果如下):




代码如下:
思路:以制作宽长比为: 102/152 的 的图像尺寸, picture2控件加载原始图片,获取原始图片长宽像素值, 对此原始像素值按照102/152的比例进行计算,计算出长度或者宽度上需要增补的尺寸,以达到102/152这一比例。然后将picture1控件的长宽尺寸设置为 通过计算后的目标尺寸,然后用StretchBlt 函数将picture2控件的图像 加载打 picture1控件,然后再保存picture1控件上的目标图片,即为保存到C盘的123.jpg 如源码。 奇怪的是 保存后的图片,下面有黑边,实在是不知道怎么处理了,求教各位高手!


'Form1上添加1个图片框picture1
Private Declare Function GetPixel Lib "gdi32" (ByVal hDC As Long, ByVal X As Long, ByVal Y As Long) As Long
Private Declare Function SetPixelV Lib "gdi32" (ByVal hDC As Long, ByVal X As Long, ByVal Y As Long, ByVal crColor As Long) As Long
Private Declare Function StretchBlt Lib "gdi32" (ByVal hDC As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal nSrcWidth As Long, ByVal nSrcHeight As Long, ByVal dwRop As Long) As Long
Private Declare Function SetStretchBltMode Lib "gdi32" (ByVal hDC As Long, ByVal nStretchMode As Long) As Long
Private Declare Function GetDC Lib "user32 " (ByVal hWND As Long) As Long
Private Const HALFTONE = 4
Private Const SRCCOPY = &HCC0020

Dim fs
Dim wScreen As Long
Dim hScreen As Long
Dim w As Long
Dim h As Long
Dim cw As Long
Dim ch As Long
Dim Dw As Long
Dim Dh As Long
Dim DifferenceH As Long
Dim DifferenceW As Long
Dim PIC As PictureBox
Dim rtn As Boolean
Dim rtm As Long
Dim Hdc1 As Long, Hdc2 As Long

Private Sub Form_Load()
Picture2.Picture = LoadPicture("C:\1.jpg")
Printer.ScaleMode = 3
Printer.ScaleWidth = 1181
Printer.ScaleHeight = 1772
Printer.ScaleLeft = 0
Printer.ScaleTop = 0
AllPrint


End Sub
Sub AllPrint() '此函数用来对图片进行裁切打印

w = Picture2.Width
h = Picture2.Height

If w <= h Then '此判断用来打印宽带小于等等高度的图片
Printer.Orientation = 1 '打印机纵向
ch = w * 152 \ 102
cw = 102 * h \ 152
DifferenceW = w - cw
DifferenceH = h - ch
Debug.Print DifferenceW
Debug.Print DifferenceH
If DifferenceW >= 0 And DifferenceH <= 0 Then
Picture1.Width = w
Picture1.Height = ch
Call SetStretchBltMode(Picture1.hDC, HALFTONE)
rtm = StretchBlt(Picture1.hDC, 0, Abs(DifferenceH / 2), w, ch, Picture2.hDC, 0, 0, w, ch, vbSrcCopy)
Picture1.Refresh
SavePicture Picture1.Image, "c:\123.jpg "
End If
End If
End Sub
...全文
评论 11
收藏 已收藏
分享
返回顶部
tdlthm
VBA 2,506 成员 10,830 内容