• Domingo 15 de Diciembre de 2024, 02:55

Autor Tema:  Bmp En Escala De Grises A Bmp Monocromo  (Leído 4109 veces)

cheman

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
Bmp En Escala De Grises A Bmp Monocromo
« en: Miércoles 12 de Septiembre de 2007, 11:20 »
0
Buenas, necesito hacer un código que simplifique una imagen BMP en escala de grises (8bits) a un BMP monocromo, estoy usando dev-c++ en windows.
 ¿Alguna idea? Desde ya mil gracias.

Salud!
Chema

LeGatoRojo

  • Miembro HIPER activo
  • ****
  • Mensajes: 552
  • Nacionalidad: mx
    • Ver Perfil
    • LeGatoRojo
Re: Bmp En Escala De Grises A Bmp Monocromo
« Respuesta #1 en: Jueves 13 de Septiembre de 2007, 20:06 »
0
Hace ya bastante tiempo que hize un libreria gráfica en turbo c++ que solo servia en tecnologias anteriores a la NT  <_< . Bueno el caso es que tenia una funcion que abria bmp's( no todos, algunos con encriptación no los abria bién), el punto es que si iniciabas una resolucion grafica de 8bits, convertia el color rgb al mas cercano en la paleta de colores, inclusive en blanco y negro; usaba la suma de los cuadrados de cada elemento rgb( que se incluye en la paleta de los bmp de menos de 15b) y sacaba su raiz, los comparaba con los colores de la paleta del modo 8bits y sacaba el mas cercano, era algo lento para modos de 256 colores, pero para 16 y 2 funcionaba bastante rapido, supongo que asi el único problema radica en encontrar el rgb del bmp en escala de grises.
Un día desperte y en lugar de dientes tenía colmillos, en lugar de manos, tenía garras; pero lo más impactante fue el color escarlata de mi pelaje.

Geo

  • Miembro de PLATA
  • *****
  • Mensajes: 1011
  • Nacionalidad: mx
    • Ver Perfil
    • http://hsblog.mexchip.com
Re: Bmp En Escala De Grises A Bmp Monocromo
« Respuesta #2 en: Jueves 13 de Septiembre de 2007, 21:38 »
0
Si usas alguna biblioteca que contenga funciones para carga de mapas de bits no creo que sea complicado, si lo vas a hacer todo tú mismo (leer byte a byte el archivo), busca la documentación del formato BMP (prueba http://www.wotsit.org), también busca en el foro de retos, en el "reto bitmap" pudieras encontrar algo que te sirva.

Ya teniendo el archivo cargado, para discriminar los valores debes definir un "umbral", es decir, un valor a partir del cual tus pixeles se convertirán en 1 o en 0, este valor lo puedes definir escogiendo la mitad (128), o algún otro que sirva a tus fines.

Suerte.
La imaginación es el límite.
Hardware & Software | Mexchip

GsOiD

  • Miembro activo
  • **
  • Mensajes: 83
  • Nacionalidad: mx
    • Ver Perfil
Re: Bmp En Escala De Grises A Bmp Monocromo
« Respuesta #3 en: Sábado 15 de Septiembre de 2007, 00:47 »
0
Hace tiempo trabajé con BMP's hice un programita que transformaba bitmaps a escala de grices... quizá esto te de una idea:

//TRANSFORMA A GRISES ARCHIVOS BMP

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


#define MAX_NOMARCH 256


int main (int argc, char *argv[])
{
   FILE *fpin;
   char *nome, str[MAX_NOMARCH + 1], id[] = "  ";
   long int despl, ancho, alto, bxp;

   if (argc > 1)
      nome = argv[1];
   else {
      printf ("Archivo BMP que se va a transformar: ");
      fgets (str, MAX_NOMARCH, stdin);
      nome = str;
   }

   if ((fpin = fopen (nome,"rb")) == NULL) {
      fprintf (stderr, "Error al abrir el archivo %s\n", nome);
      exit (EXIT_FAILURE);
   }

   printf ("Datos de la imagen:\n");
   fread (id, 2, 1, fpin);
   printf ("\tIdentificador de bitmap: %s\n", id);
   fseek (fpin, 10L, SEEK_SET);
   fread (&despl, sizeof (long), 1, fpin);
   printf ("\tDesplazamiento a los datos: %ld\n", despl);
   fseek (fpin, 18L, SEEK_SET);
   fread (&ancho, sizeof (long), 1, fpin);
   fread (&alto, sizeof (long), 1, fpin);
   printf ("\tDimensiones de la imagen, ancho: %ld, alto: %ld\n", ancho, alto);
   fseek (fpin, 28L, SEEK_SET);
   fread (&bxp, sizeof (long), 1, fpin);
   printf ("\tBits por pixel: %ld\n", bxp);

   if (strcmp (id, "BM"))
   { fprintf (stderr, "La imagen debe ser un bitmap.\n"); }

   //CAMBIO A GRIS PARA IMAGENES DE 8 BITS
   if(bxp==8)
   {
    int i;
    FILE *fpout;
    fseek (fpin, 0L, SEEK_SET);
    fpout = fopen ("Igris.bmp", "wb");
    for (i=0; i < despl; i++)
    fputc (fgetc (fpin), fpout);
    for (i=0; i < ancho * alto; i++) {
    int j,gris;
    char r, g, b, q;
    fread (&b, sizeof (0.25), 1, fpin);
    fread (&g, sizeof (0.25), 1, fpin);
    fread (&r, sizeof (0.25), 1, fpin);
    read(fpin,&q,(0.25));
    gris=(0.299*r)+(0.587*g)+(0.144*B);
         for (j = 0; j < 3; j++)
        fwrite (&gris, sizeof (0.25), 1, fpout);
    }
  fclose (fpout);
  printf ("\n\tArchivo en escala de grises ----> Igris.bmp\n");
 }
   
// CAMBIO A GRIS PARA ARCHIVOS DE 1,4 Y 24 BITS.
   else if(bxp!=8)  {
      int i;
      FILE *fpout;
      fseek (fpin, 0L, SEEK_SET);
      fpout = fopen ("Igris.bmp", "wb");
      for (i=0; i < despl; i++)
         fputc (fgetc (fpin), fpout);
      for (i=0; i < ancho * alto; i++) {
         int j,gris;
         char r, g, b;
         fread (&r, sizeof (char), 1, fpin);
         fread (&g, sizeof (char), 1, fpin);
         fread (&b, sizeof (char), 1, fpin);
         gris=(0.299*r)+(0.587*g)+(0.144*B);
    for (j = 0; j < 3; j++)
             fwrite (&gris, sizeof (char), 1, fpout);
      }
      fclose (fpout);
      printf ("\n\tArchivo en escala de grises ----> Igris.bmp\n");
   }
   fclose (fpin);

Espero te sirva de algo , la lógica es similar para lo que buscas hacer... es cuestión de hacer sólo unas pequeñas modificaciones =)..