Red de conocimiento del abogados - Cuestiones jurídicas del divorcio - Cómo agregar marcas de agua a imágenes JPEG, necesita código VC (urgente)

Cómo agregar marcas de agua a imágenes JPEG, necesita código VC (urgente)

Esta pregunta presenta la mayoría de los formatos de archivos de imágenes admitidos por GDI+, así como las dos clases de procesamiento de archivos de imágenes proporcionadas por GDI+: Imagen y Mapa de bits. Sabemos que en el pasado el procesamiento de imágenes era frecuente. necesario procesar imágenes de acuerdo con diferentes El formato del archivo de imagen y su estructura de almacenamiento de datos se convierten en diferentes formatos. La visualización de un archivo de imagen también se logra analizando la estructura de datos del archivo y luego leyendo los datos de imagen relevantes. Ahora, GDI+ proporciona clases de Imagen y Mapa de bits para que podamos procesar imágenes fácilmente.

Descripción general

GDI+ admite los formatos de archivos de imagen más populares, como BMP, GIF, JPEG, TIFF y PNG. Primero presentemos estos archivos de imagen y luego expliquemos las características admitidas por las clases Imagen y Mapa de bits.

1. Introducción a los formatos de archivos de imagen

Un archivo de imagen es un archivo de disco de computadora que representa una imagen y hay no menos de docenas de formatos de archivo. Aquí solo presentamos formatos de archivos de imagen como BMP, GIF, JPEG, TIFF y PNG.

Formato de archivo BMP

El formato de archivo de imagen BMP es el formato de imagen estándar establecido por Microsoft para su entorno Windows. Un mapa de bits BMP de Windows es en realidad una matriz de bits correspondiente a los píxeles de visualización. Hay dos tipos: uno se llama mapa de bits GDI y el otro es mapa de bits DIB (mapa de bits independiente del dispositivo). El mapa de bits GDI contiene una estructura de datos de Windows relacionada con el módulo GDI de Windows. Esta estructura de datos está relacionada con el dispositivo, por lo que este mapa de bits también se denomina mapa de bits DDB (mapa de bits dependiente del dispositivo). Cuando el programa del usuario obtiene información de datos de mapa de bits, el método de visualización del 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 de programación sobre los mapas de bits GDI, como su propia información de color, lo que facilita la gestión de la paleta. Y cualquier máquina que ejecute Windows puede manejar DIB y, por lo general, se guardan en el disco como archivos con la extensión .BMP o existen como recursos en los archivos EXE o DLL del programa.

Formato de archivo GIF

El formato de intercambio de gráficos (GIF: formato de intercambio de gráficos) fue establecido por primera vez por CompuServe el 15 de junio de 1987. Se utiliza principalmente para datos de gráficos de red CompuServe en línea. transmisión y almacenamiento. GIF proporciona suficiente información y la organiza bien para permitir que muchos dispositivos de entrada y salida diferentes intercambien imágenes fácilmente. Admite color de 24 bits, implementado mediante una paleta de hasta 256 colores y tiene el tamaño de imagen más grande: 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 arduo y meticuloso trabajo, en marzo de 1991, se propuso el proyecto de recomendación No. ISO CD 10918: "Codificación de compresión digital de imágenes fijas en múltiples escalas de grises" (a menudo denominado 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. Incluye 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, aunque se pierde información, la relación de compresión puede ser muy grande. Por ejemplo, cuando se comprime de 20 a 40 veces, la distorsión es básicamente invisible para el ojo humano.

El archivo de imagen JPEG también es un formato de archivo de píxeles, pero es mucho más complejo que los archivos de imagen como BMP. Afortunadamente, Image de GDI+ brinda soporte para el formato de archivo JPEG, por lo que no necesitamos saber mucho sobre el formato JPEG para procesar imágenes en este formato.

Formato de archivo TIFF

TIFF (archivo de formato de imagen etiquetado, formato de archivo de imagen de logotipo) fue lanzado por primera vez por Aldus Company en 1986. Puede procesar todo, desde monocromo hasta color verdadero de 24 bits. Cualquier imagen es compatible y es 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 se utiliza para definir el tipo de datos de la 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. Es para adaptarse a la red. Un formato de archivo de imagen. diseñado para la transmisión de datos, utilizado para reemplazar el formato de archivo de imagen GIF con un formato más 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 suele ser 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 tres tipos de imágenes principales: imágenes en color verdadero, imágenes en escala de grises e imágenes de datos de índice de color. JPEG solo admite los dos primeros tipos de imágenes y, aunque GIF puede usar la paleta de escala de grises para compensar el nivel de escala de grises de la imagen, en principio solo admite el tercer tipo de imagen.

Descripción general de las clases mage y Bitmap

La clase Imagen de GDI+ encapsula archivos de imagen BMP, GIF, JPEG, PNG, TIFF, WMF (Windows Metfile) y EMF (WMF mejorado). conversión de formato y funciones de procesamiento simples. 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 operaciones de píxeles en mapas de bits respectivamente, lo que puede brindar la posibilidad de suavizar y enfocar la imagen.

3. Método DrawImage

DrawImage es el método principal de la clase GDI+ Graphics para mostrar imágenes y tiene muchas funciones sobrecargadas. Las funciones sobrecargadas generales de uso común son:

Status DrawImage( Image* image, INT x, INT y

Status DrawImage( Image* image, const Rect& rect); >

p>

Estado DrawImage( Imagen* imagen, Punto constante* destPoints, INT count

Estado DrawImage( Imagen* imagen, INT x, INT y, INT srcx, INT srcy); ,

INT srcwidth, INT srcheight, Unit srcUnit

Entre ellos, (x, y) se utiliza para especificar la posición donde se muestra la imagen. la esquina superior izquierda de la imagen de la imagen. rect se usa para especificar el área rectangular llena por la imagen, y destPoints y count se usan para especificar los vértices y el número de vértices de un polígono respectivamente. Si el recuento es 3, significa que el polígono es un paralelogramo y el sistema proporciona automáticamente el otro vértice. En este momento, los datos en destPoints corresponden a las coordenadas del vértice de la esquina superior izquierda, la esquina superior derecha y la esquina 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 utilizada. De forma predeterminada, se utiliza PageUnitPixel, que utiliza píxeles como unidad de medida.

Llamar y mostrar archivos de imagen

Es muy fácil llamar y mostrar archivos de imagen en GDI+. Generalmente, primero llama a un archivo de imagen a través de Imagen o Mapa de bits para construir un objeto, y luego. luego llame a Graphics. El método ::DrawImage muestra toda o parte de una imagen en una ubicación específica.

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->m_hDC );

Imagen de imagen (L"sunflower. jpg" );

gráficos.DrawImage(&image, 10,10);

Rect rect(130, 10, image.GetWidth(), image.GetHeight()); < /p >

Graphics.DrawImage(&image, rect);

}

El resultado se muestra en la Figura 7.17. En la figura podemos ver los resultados de los dos. DrawImages son diferentes Sí, debería ser lo mismo. ¿Qué está pasando? Resulta que DrawImage escalará automáticamente según la resolución del dispositivo cuando no se especifica el tamaño del área de visualización, lo que dará como resultado resultados de visualización diferentes.

Por supuesto, también puedes usar la clase Bitmap para cargar un archivo de imagen para construir un objeto Bitmap, y el resultado es el mismo. Por ejemplo, el código anterior se puede cambiar a:

Bitmap bmp(L"sunflower.jpg");

graphics.DrawImage(&bmp, 10,10); >

Rect rect(130, 10, bmp.GetWidth(), bmp.GetHeight());

graphics.DrawImage(&bmp, rect); Tenga en cuenta que Image El método GetThumbnailImage también se proporciona para obtener un puntero en miniatura. La miniatura se puede mostrar después de llamar a DrawImage, lo cual es extremadamente útil durante la vista previa de la imagen. Por ejemplo, el siguiente código:

Gráficos gráficos( pDC->m_hDC

Imagen imagen(L"sunflower.jpg");

Imagen* pThumbnail = image.GetThumbnailImage(50, 50, NULL, NULL);

//Mostrar miniaturas

graphics.DrawImage(pThumbnail, 20, 20); > //Después de su uso, no olvide eliminar el puntero de la miniatura

eliminar pThumbnail;

Rotación y estiramiento de la imagen

La rotación y el estiramiento de la imagen generalmente se realizan. by Esto se logra especificando el parámetro destPoints en DrawImage. destPoints contiene los datos de los puntos definidos para el nuevo sistema de coordenadas. La figura 7.18 ilustra el método de definición del 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 X. dirección de la imagen, y el tercer punto es El método utilizado para definir el eje Y y el tamaño de la imagen en la dirección Y. Si 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, y el resultado se muestra en la Figura 7.19.

Imagen imagen(L"sunflower.jpg");

graphics.DrawImage(&image, 10,10);

Punto puntos[] = { Punto (0, 0), Punto(image.GetWidth(), 0),

Punto(0, image.GetHeight())}

Matriz matriz(1,0, 0,1,230,10); // Definir una matriz de identidad con el origen de coordenadas en (230,10)

matrix.Rotate(30); // Girar 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 factores de escala respectivamente

matrix.TransformPoints(points, 3); /p>

graphics.DrawImage(&image, puntos, 3);

Punto nuevospuntos[] = {Punto(450, 10), Punto(510, 60), Punto(350, 80) };

graphics.DrawImage(&image, newpoints, 3);

Por supuesto, también puede usar Graphics::RotateTransform directamente para rotar la imagen, como el siguiente código. Sin embargo, después de configurarlo de esta manera, todos los resultados de los dibujos futuros se rotarán, lo que a veces puede resultar inconveniente.

Imagen image(L"sunflower.jpg");

graphics.TranslateTransform(230,10); // Mover el origen a (230,10)

graphics.RotateTransform(30); // Gira 30 grados en el sentido de las agujas del reloj

graphics.DrawImage(&image, 0,0);

Ajusta la calidad del algoritmo de interpolación

Cuando se escala la imagen, los píxeles de la imagen deben interpolarse. Los diferentes algoritmos de interpolación tienen diferentes efectos. Graphics::SetInterpolationMode nos permite utilizar algoritmos de interpolación con diferentes efectos de calidad según nuestras propias necesidades. Por supuesto, cuanto mayor sea la calidad, más tardará en renderizarse. El siguiente código es un modo de algoritmo de interpolación que utiliza diferentes efectos de calidad y los resultados se muestran en la Figura 7.20.

Gráficos gráficos( pDC->m_hDC );

Imagen de imagen(L"log.gif"

UINT ancho = imagen.GetWidth(); UINT height = image.GetHeight();

// Sin escala

graphics.DrawImage( &image,10,10); algoritmo de interpolación

graphics.SetInterpolationMode(InterpolationModeNearestNeighbor);

graphics.DrawImage( &image,

Rect(170, 30, (INT)(0.6 *ancho) , (INT)(0.6*height)));

// Utilizar algoritmo de interpolación de calidad media

graphics.SetInterpolationMode(InterpolationModeHighQualityBilinear

graphics.DrawImage); ( &image,

Rect(270, 30, (INT)(0.6*width), (INT)(0.6*height)));

// Utilice interpolación de alta calidad. algoritmos

graphics.SetInterpolationMode(InterpolationModeHighQualityBicubic

graphics.DrawImage( &image,

Rect(370, 30, (INT) (0.6*ancho), (INT)(0.6*height)));

De hecho, Image tiene más funciones que estas, como la conversión entre archivos en diferentes formatos. Sin embargo, estas funciones son básicamente las mismas que las de la nueva clase CImage de MFC, pero 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 los métodos y técnicas de uso de CImage.