se pueden manejar imagenes en c

Iniciado por Drewermerc, 24 Abril 2014, 04:15 AM

0 Miembros y 1 Visitante están viendo este tema.

Drewermerc

bueno lo que quiero saber es si se puede trabajar con imagenes en c y si como pasar una imagen a una matriz para asi poder analizar pixel por pixel y saber su rgb.
bueno estuve investigando para ver como podria comparar dos imagenes ya sea iguales o parecidas y encontre un metodo en el que se trata de hacer una tabla en la imagen y mediente las coordenadas y posicion de la imagen compararlas pero no se comos e haria eso de la tabla en la imagen nose si se pan como se hace o si conocen algun otro metodo.
bueno tambien que instrucciones debria usar.

eferion

Por supuesto que se pueden manejar... pero claro, "imagen" es un concepto muy amplio... cada formato tiene (o suele tener, depende del framework) su propia colección de funciones y sus propias característica.

C no viene preparado de forma nativa para gestionar imágenes... pero existe un amplio abanico de librerías que te permite trabajar con ellas: ImageMagic, CImg, OpenCV...


eferion

Yo he usado openCV y, la verdad, se pueden cargar imágenes y demás... pero es una librería bastante grande y está orientada más a reconocimiento óptico y tratamiento digital de imágenes... eso no quita que no puedas crear una imagen de cero con tus propias rutinas... pero es un poco como matar moscas a cañonazos.

Para cosas sencillas es demasiado pesada.

El resto no las he usado... dí el salto a Qt y con ésta no me hace falta buscar librerías para este tipo de menesteres.

amchacon

#3
Por supuesto, yo me hize una minilibrería de imagenes para prácticar (C++). Solo reconoce imagenes BMP pero bueno:
https://dl.dropboxusercontent.com/u/69551225/Libreria%20imagenes.rar

Creas dos objetos imagen y los comparas con el operador ==. Si da true esque son iguales.

Te dejo un listado de las funciones públicas

Código (cpp) [Seleccionar]
using namespace AMC; // Todas las funciones estan en el espacio de nombres AMC

Image* LeerBmp(const char*); // Devuelve un objeto Image a partir de un BMP

/** Class IMAGE **/

Image(Cord Dimensiones = Cord(0,0),RGB color = RGB::default_color()); // Constructor para crear una imagen desde cero

void trunc(Cord,RGB color = RGB::default_color()); // Fuerza un determinado tamanyo a la imagen, si la imagen es mas grande se colorearan los nuevos pixeles con lo que pongas en el segundo tamanyo.

int getLight() const; // Brillo actual de la imagen (entre -255 y 255), si no lo has cambiado será cero
Cord getDimesions() const; // Retorna un objeto Cord con las dimensiones de la imagne
RGB getPixel(Cord a) const; // Retorna el RGB de una posicion dada
std::vector<RGB> getRow(unsigned int) const; // Retorna un vector con los pixeles de una fila
std::vector<RGB> getColumn(unsigned int) const; // Retorna un vector con los pixeles de la columna

void setLight(int b); // Selecciona el brillo (entre -255 y 255)
void setPixel(Cord a,RGB color) ; // Pinta un determinado pixel de un color
void Negative(); // Invierte los colores de la imagen

bool operator==(const Image &a) const; // Las imagenes son iguales?
bool operator!=(const Image &a) const; // Las imagenes son distintas?

/** Class Cord **/

// Representa un vector X,Y

Cord(unsigned int x,unsigned int y); // Constructor

unsigned int getX() const;
unsigned int getY() const;
void setX(unsigned int);
void setY(unsigned int);

bool operator==(const Cord) const;
bool operator!=(const Cord a) const;


/** Class RGB **/

RGB(); // Construye el color negro
RGB(int); // Construye un color a partir de su representación entera
RGB(int r,int g,int b); // Construye un color a partir de sus valores de Rojo, verde y azul
RGB(const RGB & r); // Copia

void setR(int r);
void setG(int g);
void setB(int b);

int getR() const {return R;}
int getG() const {return G;}
int getB() const {return B;}
int getInt() const; // Representación de los tres colores en formato entero

operator int();

bool operator==(const RGB & a) const;
bool operator==(int a) const;
bool operator!=(const RGB & a) const;
bool operator!=(int a) const;
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

Drewermerc

gracias a todos por responder.
bueno creo que las usare haber que tal.
y bueno nose si me puedan ayudar con esto, quiero manejar imagenes jpeg y es que bueno me enseñaron un video que dura poco tiempo y no muestra el codigo completo pero donde muestra como abre la imagen en c y obtiene algo que se llama JPEG Standard and Quantization Tables de la imagen pero no se usan libereria externas solo usa estas.
y bueno una pregunta mas e estado investigando sobre todo este tema de manejo de imagen y me encontre un procedimiento para comparar imagenes donde consiste en literarmente partir la imgen como si fuera una tabla comomuestro  acontinuacion espeor que me entiendan, y bueno mediante cooordenadas usando los pixeles se ve si la otra imagen coinside entonces las imagenes son iguales y si varia un poco decir ue se parecen. bueno nose si me entendienron y espeor que me puedan ayudar.
**********
*   *    *   *
**********
*   *    *   *
**********
*   *    *    *
**********
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <ctype.h>
#include <string.h>
y bueno por eso quisiera saber si se pueden manejar imagenes en c sin librerias externas.

eferion

la librería estándard de C no dispone de funciones para trabajar con imágenes.

amchacon

Cita de: Drewermerc en 24 Abril 2014, 18:45 PMy bueno por eso quisiera saber si se pueden manejar imagenes en c sin librerias externas.
Te lo acabo de demostrar, toda mi librería está hecha con la librería estándar. Sin librerías externas.

Cita de: Drewermerc en 24 Abril 2014, 18:45 PMy bueno una pregunta mas e estado investigando sobre todo este tema de manejo de imagen y me encontre un procedimiento para comparar imagenes donde consiste en literarmente partir la imgen como si fuera una tabla comomuestro  acontinuacion espeor que me entiendan, y bueno mediante cooordenadas usando los pixeles se ve si la otra imagen coinside entonces las imagenes son iguales y si varia un poco decir ue se parecen. bueno nose si me entendienron y espeor que me puedan ayudar.
Pues claro, ese es el procedimiento que se usa siempre. Dos imagenes son iguales si tienen el mismo tamaño y el color de sus pixeles son iguales.

El problema es descodificar el archivo de la imagen para obtener la tabla. Algunos formatos son más sencillos que otros.

Cita de: Drewermerc en 24 Abril 2014, 18:45 PMy bueno nose si me puedan ayudar con esto, quiero manejar imagenes jpeg y es que bueno me enseñaron un video que dura poco tiempo y no muestra el codigo completo pero donde muestra como abre la imagen en c y obtiene algo que se llama JPEG Standard and Quantization Tables de la imagen
JPEG es un formato chungo, intentalo mejor con BMP.

Aquí tienes una explicación de como funciona el BMP:
http://www.elotrolado.net/hilo_imagenes-bmp-destripandolas-a-fondo_1807836
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

leosansan

#7
¿Es el mismo amchacon que el de este foro, osea tu?

¡Que fuerte!, me sacas varios años de experiencia xD

amchacon

Cita de: leosansan en 24 Abril 2014, 22:21 PM
¿Es el mismo amchacon que el de este foro, osea tu?

¡Que fuerte!, me sacas varios años de experiencia xD
Anda ya xD, las imagenes BMP son de los formatos más fáciles.
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

Drewermerc

hola a todos.
buen gracias por contestar y bueno pues creo que revisare las librerias que me recomndaron y bueno creo que  me tendre que informar mas para poder obtener la tabla de jpeg por que se que si se puede optener y bueno pues creo que lo revisare desues por que por lastima ahorita no le puedo dedicar tiemp completo y bueno cmuhasgracias a todos por su ayuda un saludo.