Escenas
- En el desarrollo de WTL programas,
Gdiplus
dibujarPNG
se utilizan imágenes. A veces se encontrará con las siguientes situaciones. Al dibujar una imagen original con la misma anchura y altura, la imagen se ve claramente en la interfaz, y cuando laPNG
anchura y la altura se reducen, la imagen dibujada obviamente irregular. ¿Cuál es la razón?
Descripción
-
Utilice el
Gdiplus::Graphics
método de objetoDrawImage
para dibujar elRect
área rectangular de origen de la imagen original en el destinoRect
, es decir, si el ancho y el alto del área de destino y el área de origen son inconsistentes, la imagen se ampliará y dibujará. Por ejemplo, tenemos un256x256
ícono, y luego necesitamos dibujar el ícono de zoom en la esquina superior izquierda de la barra de título, y el ícono de esta posición no solo es necesario32x32
, si no tiene un32x32
ícono pequeño separado , debemos llamar al ícono grandeDrawImage
cuando Especifique el ancho y la altura del área de destino32x32
, de modoGraphics
que el icono se escale al dibujar, por lo que no es necesario crear uno nuevoGdiplus::Bitmap
para dibujar. -
Graphics
Al escalar el icono, elInterpolation Mode
modo de interpolación determina la calidad del escalado. Porgraphics.SetInterpolationMode
establecer el modo de interpolación, porgraphics.GetInterpolationMode
la obtención del modo de interpolación actual. -
En el archivo de encabezado
<gdiplusenums.h>
, las siguientes constantes de enumeración son opcionales.InterpolationModeDefault
El valor es el valor del modo de interpolación predeterminado, que es igual aInterpolationModeLowQuality
e igual aInterpolationModeBilinear
. YInterpolationModeHighQuality
es compatible con la opción de calidad máxima predeterminada aquí porque la calidad es la mejorInterpolationModeHighQualityBicubic
, por loInterpolationModeHighQuality
que es igualInterpolationModeHighQualityBicubic
.typedef enum InterpolationMode { InterpolationModeInvalid, InterpolationModeDefault, // 默认,即等于 InterpolationModeBilinear InterpolationModeLowQuality, // 默认,即等于InterpolationModeBilinear InterpolationModeHighQuality, // 最高质量,即等于InterpolationModeHighQualityBicubic InterpolationModeBilinear, // 双线性插值 InterpolationModeBicubic, // 双三次插值 InterpolationModeNearestNeighbor, // 最近邻插值 InterpolationModeHighQualityBilinear, InterpolationModeHighQualityBicubic } ;
-
El siguiente código se puede utilizar para verificar su relación: La calidad del modo de interpolación es la misma que su valor constante de enumeración, de menor a mayor. Si desea establecer la mayor calidad de zoom, utilice
InterpolationModeHighQualityBicubic
parámetros. Por supuesto, cuanto mayor sea la calidad, más recursos informáticos se necesitan. A medida queCPU
mejora el rendimiento, esta pérdida puede ignorarse. Si sigue el algoritmo de optimización más alto admitido por el sistema, puede configurarloInterpolationModeHighQuality
y el valor más alto actual sigue siendo igual aInterpolationModeHighQualityBicubic
.graphics.SetInterpolationMode(InterpolationModeLowQuality); auto mode = graphics.GetInterpolationMode(); // mode:InterpolationModeBilinear
ejemplo
- Echemos un vistazo a un
128x128
icono que utiliza el modo de interpolación predeterminado y más alto. La calidad es muy diferente. El círculo exterior de baja calidad tiene rebabas y la alta calidad es suave.
InterpolationModeBilinear (InterpolationModeLowQuality)
Figura 1:
InterpolationModeHighQualityBicubic (InterpolationModeHighQuality)
Figura 2:
Imagen original
referencia
Uso del modo de interpolación para controlar la calidad de la imagen durante el escalado