VB cambia el tamaño de la imagen y la guarda. Por ejemplo, la imagen existente es 256*128 y quiero cambiarla a 15*15.
. Como resultado, la eficiencia del programa es aún más sorprendente. Si está interesado, puede consultar el enlace del foro que proporcioné en esta publicación.
Así que la solución que estoy usando aquí proviene de ellos. Pero estos ejecutivos se centran en la eficiencia y una gran parte del proceso consiste en comparar diferentes algoritmos probados en el tiempo. Para aquellos que están más centrados en el uso, es necesario podar el código. Lo revisé de manera aproximada y no hice ningún cambio en el contenido del módulo. Solo mencioné el contenido que necesitábamos del programa principal.
Entonces, comencemos.
En primer lugar, al usar tres módulos y un módulo de clase, no tenemos que reescribir esta parte del código. Simplemente agréguelo al crear su programa. Tenga en cuenta que si ya tiene un proyecto en curso, es posible que simplemente importar el módulo no funcione. Laviewpbt nos dio una buena demostración. Sus declaraciones API están todas en un módulo, por lo que es mejor hacer lo mismo para su proyecto. Luego, pegue sus declaraciones API en la parte posterior. Si hay duplicados al ejecutar el programa, será. descubierto automáticamente, ¡y luego podrás detenerlo! Luego lo vuelves a bloquear, lo comentas o lo eliminas. Publicaré el contenido de estos módulos al final; todavía no puedo cargar archivos adjuntos aquí.
Entonces, centrémonos en cómo usarlo.
DIBData privado como CImageDiBWork privado como CImage
El primer paso es declarar dos variables de clase. Esta es nuestra clase personalizada. Está en el módulo.
Luego hay dos fragmentos de código, uno para cargar la imagen y el otro para cambiar el tamaño de la imagen.
Necesitamos abrir la imagen e inicializar las dos cantidades anteriores. El proceso de inicialización está escrito en form_load.
Establecer DIBData = Nueva CImage
Establecer DIBWork =. New CImage
scaNum = 1 'Esta es la relación
scaWidth = Me.Width 'Esta es la referencia inicial al ancho del formulario
Picture1.Picture = LoadPicture(App.Path & "\Imagen pequeña del campo de balonmano.jpg")
Atenuar DIBTemp como nueva imagen C
Si DIBTemp.LoadPictureFromFile(App.Path & "\Imagen pequeña del campo de balonmano .jpg") Función de declaración GetDIBColorTable Lib "gdi32" (ByVal Hdc As Long, ByVal
un1 As Long, ByVal un2 As Long, pRGBQuad As RGBQUAD) As Long
Función de declaración pública SelectObject Lib "gdi32.dll " (ByVal Hdc As Long, ByVal hObject As Long) As Long
Público
Declarar función BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal X As
Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nWidth As Long, ByVal nHeight As Long,
ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal
dwRop As Long) As Long
Función de declaración pública SetStretchBltMode Lib "gdi32" (ByVal Hdc As Long、ByVal nStretchMode As Long) As Long
Pública
Declarar función StretchBlt Lib "gdi32" (ByVal Hdc As Long, ByVal X As
Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nWidth As Long, ByVal nHeight Mientras,
p>ByVal hSrcDC Mientras, ByVal xSrc Mientras, ByVal ySrc Mientras, ByVal
nSrcWidth Mientras, ByVal nSrcHeight ByVal nSrcHeight Mientras, ByVal dwRop Como Long) As
Long
Función de declaración pública SetDIBitsToDevice Lib "gdi32" (ByVal Hdc
As Long, ByVal X As Long, ByVal ySrc As Long, By
Val dwRop As Long) ByVal >
ByVal NumScans As Long, Bits As Any, BitsInfo As BITMAPINFO, ByVal
wUsage As Long) As Long
Función de declaración pública GetTickCount Lib " kernel32" () Mientras
Función de declaración pública QueryPerformanceFrequency Lib "kernel32" (lpFrequency como moneda) Mientras
Función de declaración pública QueryPerformanceCounter Lib "kernel32" (lpPerformanceCount como moneda) Mientras
Módulo de clase, CImage;Nombre de archivo CImage.cls
Opción explícita
Privado m_Width As Long 'El ancho de la capa
Private m_Height As Long 'La altura de la capa
Private m_Stride As Long 'El tamaño de cada fila escaneada de datos de capa
Private m_Hdc As Long 'La memoria DC de la capa
Private m_Pointer As Long La primera dirección de datos de capa en la memoria w
Private m_Handle As Long 'Un identificador que apunta a DIBSection
Private m_OldHandle As Long 'Un identificador que apunta a el entorno del dispositivo original
Propiedad pública Obtener ancho() siempre
Ancho = m_Width
Propiedad final
Propiedad pública Obtener altura( ) Mientras
Altura = m_ Altura
Propiedad final
Propiedad pública Obtener Stride() As Long
Stride = m_Stride p>
Propiedad final
Propiedad pública Obtener Hdc( ) siempre que
Hdc = m_Hdc
Propiedad final
Propiedad pública Obtener Handle() mientras
Handle = m_Handle
End Property
PublicProperty Obtener Pointer() mientras
Handle = m_Handle
Propiedad final
p>Propiedad pública Obtener puntero() siempre
Puntero = m_Pointer
Propiedad final
Subclase privada_
Terminate()
DisposeResource
End Sub
Función pública CreateNewImage(ByVal Ancho mientras, _ ByVal Alto mientras) Como booleano
Dim ScreenDC As Long, BmpInfo As BITMAPINFOHEADER
Si Ancho <= 0 o Alto <= 0, salga de la función
DisposeResource 'Eliminar el recurso de memoria original
Utilice BmpInfo
.BitCount = 24
.Height = -Height 'Crea un DIB invertido para que coincida con el sistema de coordenadas del objeto GDI (las coordenadas iniciales están en la esquina superior izquierda )
.Ancho = Ancho
.Planos = 1
.Tamaño = 40
m_ Zancada = ((Ancho * 3 + 3) Y &HFFFFFFFC)
.SizeImage = m_Stride * Height
Terminar con
ScreenDC = GetDC(0) 'Obtener pantalla DC
m_Hdc = CreateCompatibleDC(ScreenDC)
ReleaseDC 0, ScreenDC 'Liberar pantalla DC
m_Handle = CreateDIBSection(m_Hdc, BmpInfo, DIB_RGB_COLORS, m_ Pointer, 0, 0)
Si m_Handle <> 0 Entonces 'Espero que el sistema nos permita crear DIB exitosamente
m_OldHandle = SelectObject(m_Hdc, m_Handle)
m_Width = Ancho: m_Height = Alto
CreateNewImage = True
Finalizar si
Finalizar función
Public Sub DisposeResource()
Si m_Hdc < > 0 Entonces<
SeleccionarObjeto m_Hdc, m_OldHandle
EliminarDC m_Hdc
EliminarObjeto m_Handle
m_Width = 0: m_Height = 0 'Restablecer imagen -relacionadas Otras propiedades
m_ Handle = 0: m_OldHandle = 0
m_Pointer = 0: m_Hdc = 0
End If
End Sub
Representación de función pública (ByVal DestDC mientras, _
Opcional ByVal DestX mientras, _
Opcional ByVal DestY mientras _
Opcional ByVal DestWidth Mientras, _
Opcional ByVal DestHeight Mientras, _
Opcional
ByVal SrcX As Long, opcional ByVal SrcY As Long, _
Opcional ByVal SrcWidth As Long, _
Opcional ByVal SrcHeight As Long) As Booleano
Si m_Handle = 0, salga de la función
Si DestWidth = 0, entonces DestWidth = m_Width
Si DestHeight = 0, entonces DestHeight = m_Height
Si SrcX < Entonces SrcX = 0 ' La fuente X,Y no puede ser negativa, pero el destino
SrcWidth = m_Width
ElseIf SrcWidth < 0 Then
DestWidth = -DestWidth
SrcWidth = -SrcWidth
Fin si
Si SrcHeight = 0 Entonces
SrcHeight = m_Height
ElseIf SrcHeight < 0 Entonces
DestHeight = -DestHeight
SrcHeight = -SrcHeight
Fin si
SetStretchWidth
SrcWidth = -SrcWidth
Finalizar si
p>
Finalizar si
SetStretchBltMode DestDC, STRETCH_HALFTONE
StretchBlt DestDC, DestX, DestY, DestWidth, DestHeight, m_Hdc, SrcX, SrcY, SrcWidth, SrcHeight, vbSrcCopy
Función final
Función pública LoadPictureFromFile(Nombre de archivo como cadena) como booleano
Atenuar el ancho durante el largo, la altura durante el largo
Atenuar el ancho durante el largo, la altura durante el largo
Atenuar el ancho durante el largo, la altura durante el largo
Atenuar el ancho durante el largo, Altura tan larga Altura tan larga
Dim StdPic As StdPicture
En caso de error, GoTo Errhandle:
Establecer StdPic = LoadPicture(FileName)
Ancho = ConvertHimetrixToPixels(StdPic.Width = ConvertHimetrixToPixels(StdPic.Render m_Hdc + 0&, 0&, 0& , Ancho + 0&, Alto +
0&, 0, StdPic.Height, StdPic.Width, - StdPic.Height
, PorVal 0