Cómo agregar marcas de agua a imágenes JPEG usando código VC (se necesita con urgencia)
Descripción general
GDI admite los formatos de archivos de imagen más populares, como BMP, GIF, JPEG, TIFF y PNG. Estos archivos de imagen se describen a continuación antes de describir la funcionalidad admitida por las clases Imagen y Mapa de bits.
1. Introducción a los formatos de archivos de imagen
Los archivos de imagen son archivos de disco de computadora que representan imágenes y existen no menos de docenas de formatos de archivo. Aquí solo se tratan los formatos de archivos de imagen BMP, GIF, JPEG, TIFF y PNG.
Formato de archivo BMP
El formato de archivo de imagen BMP es el formato de imagen estándar de Microsoft para su entorno Windows. Un mapa de bits BMP de Windows es en realidad una matriz de bits correspondientes a píxeles de visualización y viene en dos tipos: uno se llama mapa de bits GDI y el otro se llama mapa de bits DIB (mapa de bits independiente del dispositivo). Un mapa de bits GDI contiene estructuras de datos de Windows relacionadas con el módulo GDI de Windows, y un mapa de bits GDI contiene estructuras de datos de Windows relacionadas con el módulo GDI de Windows, que está relacionado con el dispositivo, por lo que este tipo de mapa de bits también se denomina mapa de bits DDB (independiente). mapa de bits para el dispositivo). Cuando un programa de usuario obtiene información de datos de mapa de bits, la forma en que se muestra el mapa de bits depende de la tarjeta de visualización. Debido a esta dependencia del dispositivo de los mapas de bits GDI, es probable que se produzcan problemas cuando el mapa de bits se transfiere a través de la red a otra PC.
DIB tiene muchas ventajas en programación respecto a los mapas de bits GDI, como que transporta información de color, lo que facilita la gestión de la paleta. Cualquier máquina que ejecute Windows puede manejar un DIB, que normalmente se guarda en el disco como un archivo con una extensión .BMP o como un recurso en un archivo EXE o DLL de programa.
Formato de archivo GIF
El formato de intercambio de gráficos (GIF - Graphics Interchange Format) fue estandarizado por primera vez por CompuServe el 15 de junio de 1987. Se utiliza principalmente para la transmisión en línea de datos gráficos en la red CompuServe y el almacenamiento. Los GIF proporcionan suficiente información y buena organización para permitir que muchos dispositivos de entrada y salida diferentes intercambien imágenes fácilmente. Admite color de 24 bits, implementado con una paleta de hasta 256 colores y tamaños de imagen de hasta 64K x 64K píxeles. GIF presenta compresión LZW, múltiples imágenes y dibujo de pantalla entrelazado.
Formato de archivo JPEG
El "Grupo Conjunto de Expertos en Fotografía" JPEG (Grupo Conjunto de Expertos en Fotografía) establecido conjuntamente por la Organización Internacional de Normalización (ISO) y el Comité Consultivo para el Telégrafo Internacional y Teléfono (CCITT) ha pasado cinco Después de años de trabajo duro y meticuloso, en marzo de 1991 se propuso un borrador de recomendación para ISO CD 10918:
El formato de archivo JPEG se basa en el formato de archivo JPEG. Proyecto de Recomendación 10918: "Codificación de compresión digital de imágenes fijas en múltiples escalas de grises" (comúnmente conocida como estándar JPEG).
Este es un estándar de compresión para imágenes digitales fijas en color y monocromáticas en escala de grises múltiples o en tonos continuos. Consta de dos partes: compresión sin pérdidas y compresión con pérdidas basada en transformada de coseno discreta y codificación de Huffman. El primero no producirá distorsión, pero la relación de compresión es muy pequeña; cuando el último algoritmo realiza la compresión de la imagen, se perderá información, pero la relación de compresión puede ser muy grande. Por ejemplo, con compresiones de 20 a 40 veces, la distorsión es esencialmente invisible para el ojo humano.
Los archivos de imágenes JPEG también son un formato de archivo de píxeles, pero son mucho más complejos que los archivos de imágenes como BMP. Afortunadamente, Image for GDI brinda soporte para el formato de archivo JPEG, por lo que no necesita saber mucho sobre el formato JPEG para trabajar con imágenes en este formato.
Formato de archivo TIFF
TIFF (archivo de formato de imagen etiquetado) fue introducido por primera vez por Aldus en 1986 y proporciona buena calidad de imagen para cualquier formato, desde monocromo hasta color verdadero de 24 bits. muy fácil de modificar y convertir entre diferentes plataformas. A diferencia de otros formatos de archivos de imagen, los archivos TIFF tienen un área de información de etiquetas que define el tipo de datos de imagen, el color y el método de compresión almacenados en el archivo.
Formato de archivo PNG
El formato de archivo PNG (Portable Network Graphic) fue propuesto y diseñado por Thomas Boutell, Tom Lane y otros. Está diseñado para adaptarse a la transmisión de datos de la red. Formato de archivo de imagen que reemplaza el formato de archivo de imagen GIF con un formato relativamente simple y estrictas restricciones de patente. Además, este formato de archivo de imagen puede incluso reemplazar hasta cierto punto el formato de archivo de imagen TIFF más complejo. Sus características principales incluyen: la eficiencia de compresión es generalmente mayor que la del GIF, proporciona un canal Alfa para controlar la transparencia de la imagen, admite el mecanismo de corrección Gamma para ajustar el brillo de la imagen, etc.
Cabe señalar que el formato de archivo PNG admite principalmente tres tipos de imágenes: imágenes en color verdadero, imágenes en escala de grises e imágenes de datos indexados en color. JPEG solo admite los dos primeros tipos de imágenes, mientras que GIF puede usar una paleta de escala de grises para compensar la escala de grises de la imagen, pero en principio solo admite el tercer tipo de imagen.
Descripción general de las clases mage y Bitmap
La clase Image de GDI encapsula la importación, el formateo y el procesamiento simple de BMP, GIF, JPEG, PNG, TIFF, WMF (metarchivo de Windows) y EMF. Funcionalidad de archivo de imagen (WMF mejorada). Bitmap es una clase de imagen heredada de la clase Image y encapsula funciones comunes de las operaciones de mapa de bits de Windows. Por ejemplo, Bitmap::SetPixel y Bitmap::GetPixel se utilizan para leer y escribir píxeles en un mapa de bits, lo que brinda la posibilidad de suavizar y enfocar imágenes.
3. Método DrawImage
DrawImage es el método principal para mostrar imágenes en la clase de gráficos GDI. Tiene muchas funciones sobrecargadas.
Las funciones sobrecargadas generales comunes son
Status DrawImage(Image* image, INT x, INT y
Status DrawImage(Image* image, const Rectamp; rect);
Estado DrawImage(Imagen* imagen, const Rectamp; rect);
p>
Estado DrawImage( Imagen* imagen, const Point* destPoints, recuento INT);
Estado DrawImage( Imagen* imagen, INT x, INT y, INT srcx, INT srcy,
INT srcwidth, INT srcheight, Unidad srcUnit
Entre ellos (x, y); ) se utiliza para especificar la posición de la imagen mostrada, que equivale a la esquina superior izquierda de la imagen. rect se usa para especificar el área rectangular que será rellenada por la imagen, y destPoints y count se usan para especificar los vértices y el número de vértices del polígono respectivamente. Si el recuento es 3, el polígono es un paralelogramo y el sistema proporciona automáticamente otro vértice. En este caso, los datos en destPoints corresponden a las coordenadas de vértice de las esquinas superior izquierda, superior derecha e inferior izquierda de la imagen de origen. srcx, srcy, srcwidth y srcheight se utilizan para especificar la posición y el tamaño de la imagen de origen que se mostrará. srcUnit se utiliza para especificar la unidad que se utilizará. De forma predeterminada, los píxeles se utilizan como unidad de medida, que es PageUnitPixel.
Llamar y mostrar archivos de imagen
Llamar y mostrar archivos de imagen en GDI es muy simple, generalmente llamando al archivo de imagen a través de Imagen o Mapa de bits para construir un objeto y luego llamando a Gráficos: :DrawImage El método muestra toda o parte de la imagen en la ubicación especificada. Por ejemplo, el siguiente código:
void CEx_GDIPlusView::OnDraw(CDC* pDC)
{
CEx_GDIPlusDoc* pDoc = GetDocument(); >
ASSERT_VALID(pDoc);
usando el espacio de nombres Gdiplus
Gráficos ( pDC-gt; m_hDC ); .jpg" );
gráficos.DrawImage(amp; imagen, 10, 10);
Rect rect(130, 10, image.GetWidth(), image.GetHeight() );
graphics.DrawImage(amp; image, rect);
}
El resultado se muestra en la Figura 7.17.
El resultado se muestra en la Figura 7.17. En la figura, podemos ver que los resultados de los dos DrawImages son diferentes y deberían ser los mismos. Resulta que cuando no se especifica el tamaño del área de visualización, DrawImage escalará automáticamente según la resolución del dispositivo, lo que dará como resultado diferentes efectos de visualización.
Por supuesto, también puedes usar la clase Bitmap para llamar a un archivo de imagen para construir un objeto Bitmap, y el resultado es el mismo.
Rect rect(130, 10, bmp.GetWidth()), bmp.GetHeight()
graphics.DrawImage(amp; bmp, rect);
Vale la pena señalar que Image también proporciona un método GetThumbnailImage para obtener el puntero de miniatura, que se puede mostrar después de llamar a DrawImage. Esto es útil al obtener una vista previa de imágenes. Por ejemplo, el siguiente código:
Gráficos gráficos( pDC-gt; m_hDC
Imagen imagen(L "sunflower.jpg"); * pThumbnail = image.GetThumbnailImage (50, 50, NULL, NULL
//Mostrar miniaturas
graphics.DrawImage(pThumbnailImage*); pThumbnail = image.GetThumbnailImage (50, 50, NULL, NULL);
// Mostrar miniatura DrawImage (pThumbnail, 20, 20); elimínelo después de usarlo. Este puntero de miniatura
eliminar pThumbnail
Imagen* pThumbnail = imagen. p>Rotación y estiramiento de imágenes
La rotación y estiramiento de imágenes generalmente se logra especificando el parámetro destPoints en DrawImage, que contiene datos sobre los puntos definidos para el nuevo sistema de coordenadas. La figura 7.18 muestra cómo definir un sistema de coordenadas.
Como se puede ver en la figura, el primer punto en destPoints se usa para definir el origen de las coordenadas, el segundo punto se usa para definir el método del eje X y el tamaño de la imagen en la dirección X. Y los terceros puntos se utilizan para definir el método del eje Y y el tamaño de la imagen en la dirección Y. Si las direcciones de los dos ejes en el nuevo sistema de coordenadas definido por destPoints no son perpendiculares, se puede lograr el efecto de estiramiento de la imagen.
El siguiente código es un ejemplo de rotación y estiramiento de imágenes, cuyos resultados se muestran en la Figura 7.19.
Imagen imagen(L "sunflower.jpg");
graphics.DrawImage(amp; imagen, 10, 10);
Punto puntos[] = { Punto(0, 0), Punto(imagen.
Matriz matriz(1, 0, 0, 1, 230, 10); // Definimos una matriz unitaria, el origen de coordenadas es (230, 10 )
matrix.Rotate(30); // Gira 30 grados en el sentido de las agujas del reloj
matrix.Scale(0.63, 0.6); // Las direcciones X e Y se multiplican por 0,63 y 0,6. respectivamente Factor de escala Multiplique por los factores de escala 0,63 y 0,6 en las direcciones X e Y respectivamente.
matrix.TransformPoints(points, 3); // Utilice esta matriz para transformar puntos
graphics.DrawImage(amp; image, points, 3); > Punto nuevospuntos[] = {Punto(450, 10), Punto(510, 60), Punto(350, 80)};
graphics.DrawImage(amp; imagen, puntos, 3); /p>
p>
matrix.Scale(0.63, 0.6); // Multiplica las direcciones X e Y por los factores de escala de 0.63 y 0.6 respectivamente. DrawImage(amp;image, newpoints, 3);
Por supuesto, también puedes usar Graphics::RotateTransform directamente para rotar la imagen, como se muestra en el siguiente código. Sin embargo, en esta configuración, todos los dibujos futuros se rotarán, lo que a veces puede resultar inconveniente. DrawImage(amp; image, 0, 0);
Ajusta la calidad del algoritmo de interpolación
Al escalar una imagen, los píxeles de la imagen deben interpolarse diferentes algoritmos de interpolación. tienen un efecto diferente. SetInterpolationMode nos permite utilizar diferentes algoritmos de interpolación con diferentes efectos de calidad según nuestras necesidades. Por supuesto, cuanto mayor sea la calidad, mayor será el tiempo de renderizado. El siguiente código utiliza modos de algoritmo de interpolación con diferentes efectos de calidad y los resultados se muestran en la Figura 7.20. SetInterpolationMode( InterpolationModeHighQualityBicubic);
graphics.DrawImage( amp; imagen,
Rect(370, 30, (INT)(0,6*ancho), (INT)(0,6*alto) )));
De hecho, las funciones de Imagen son mucho más que estas, como la conversión entre diferentes formatos de archivo. Sin embargo, estas funciones son básicamente las mismas que las funciones CImage de la nueva clase de MFC, excepto que CImage está más en línea con los hábitos de programación de los programadores de MFC, por lo que en la siguiente sección nos centraremos en el uso de métodos y técnicas de CImage.