干货! 用StretchBlt处理图片,保存后的图片有黑边?
用 StretchBlt 处理图像有后黑边,
原图如下:
处理后保存的图片如下(处理后的图片超过2M 论坛上传不了,故对图片进行了QQ截图,展示效果如下):

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

处理后保存的图片如下(处理后的图片超过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
...全文


