Red de conocimiento informático - Problemas con los teléfonos móviles - 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.

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.

En primer lugar, laviewpbt en CSDN proporciona la declaración de que la parte del código principal a continuación está completamente copiada, a la que proporcioné un enlace en las preguntas frecuentes anteriores de VB. Cuando mencioné la eficiencia de VB en ese momento, di un ejemplo de escalado de imágenes escrito en VB que era realmente muy eficiente, lo que demuestra la importancia del algoritmo. laviewpbt se inspiró en zyl910 en CSDN, cuyo nombre parece ser Zhou Yueling

. 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

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