2010-07-07 16 views
5

El título explica mucho mi pregunta. Me gustaría poder leer y escribir datos JPEG por píxel usando C#.¿Cómo puedo leer y escribir datos JPEG por píxel?

Estoy pensando en algo en la línea de CreateJPEG(x, y) la que una imagen JPEG en blanco establecería en la memoria, y me daría un objeto JPEG, y luego algo así como SetPixel(x, y, Color) y GetPixel(x, y) el último de los cuales se obtendrá una Color o algo similar. A continuación, puede llamar a un método Apply() o Save(), por ejemplo, para guardar la imagen en un formato estándar legible para JPEG (preferiblemente con opciones de compresión, pero eso no es necesario).

Y supongo que algo de biblioteca C o espacio de nombres hace que todo esto sea un proceso muy fácil, solo me gustaría saber la mejor manera de hacerlo.

+0

Solo tenga en cuenta que cuando cambia un solo píxel de una imagen codificada en JPEG, más píxeles de la imagen cambiarán debido a la compresión sin pérdida que implementa JPEG. –

+0

Solo una nota sobre el formato JPEG, ya que es una compresión con pérdida, entonces el color de un píxel individual puede cambiar entre guardados, incluso si no lo cambiaste directamente, así que no confíes en que los colores de los píxeles permanezcan constantes EDITAR: golpeado :) –

+0

Derecha;) Lo estaba preguntando porque me gustaría intentar escribir algún software de comparación de imágenes, básicamente, con 2 imágenes, produzco un mapa de bits de las diferencias. Sé que ya se ha hecho antes, pero sería una buena práctica para mí, y solo necesitaba un punto rápido en la dirección correcta (algo de lo que SO es realmente bueno, en realidad). :) – qJake

Respuesta

9

Echa un vistazo a la clase Bitmap. Para el dibujo avanzado además de manipular un solo píxel, deberá usar la clase Graphics.

var image = new Bitmap("foo.jpg"); 

var color = image.GetPixel(1, 2); 
image.SetPixel(42, 42, Color.White); 

image.Save("bar.jpg", ImageFormat.Jpeg); 

Como Lasse V. Karlsen menciona en esta respuesta, esto realmente no manipulará el archivo JPEG. El archivo JPEG se descomprimirá, se modificarán los datos de esta imagen y, al guardar, se creará un nuevo archivo JPEG a partir de los datos alterados de la imagen.

Esto reducirá la calidad de la imagen porque incluso la recompresión de una imagen inalterada generalmente no produce un archivo JPEG idéntico a bit debido a la naturaleza de las compresiones JPEG con pérdida.

Hay algunas operaciones que se pueden realizar en archivos JPEG sin descomprimir y volver a comprimir - por ejemplo, girar 90 ° - poner manipular píxeles individuales no cabe en esta categoría.

+1

"Sin pérdida de compresión"? Te refieres a con pérdidas. – Dykam

+0

Bastante posible ...: D Thx! –

8

JPEG no es un formato de procesamiento, es un formato de almacenamiento.

Como tal, realmente no usa una imagen JPEG en la memoria, solo tiene una imagen. Solo cuando lo guardas, eliges el formato, como PNG o JPEG.

Como tal, creo que estás buscando la clase Bitmap en .NET.

Cuestiones relacionadas