Necesito ayuda [C#]

Started by Yawin, April 11, 2011, 10:37:10 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Yawin

Os explico:
Estoy trabajando con etiquetadoras industriales. Tengo que finalizar un programa que sirve para diseñar las etiquetas y añadirlas al firmware de la etiquetadora, para que imprima cuando haga falta. El tema es que la etiquetadora sólamente acepta imágenes .PCX en modo de color binario/monocromo. Por ello, queremos que el programa, permita abrir cualquier imagen, y cuando envíe la imagen a la impresora, primero la convierta.

Con un simple código, soy capaz de capturar el color de cada pixel y calcular si tiene que ser negro o blanco (dependiendo de la intensidad que se le marque); y, con una librería que me he encontraod por ahí, puedo convertir a PCX.

Pero, aun así, la imagen no es monocromo. Y no se cómo carajo hacerlo. Y no encuentro documentación por ahí.

¿Sabe alguno de vosotros qué puedo hacer?
Sigue el desarrollo de mi motor RPG: https://www.youtube.com/watch?v=TbsDq3RHU7g

process main()
       begin
           loop
               pedo();
               frame;
            end
       end


Yawin

He estado mirando los links que salen ahí. Pero son diferentes algoritmos para pasar una imagen a blanco y negro. Esa parte ya la tengo.

Realmente, lo único que no tengo, es que alguardar la imagen, en el fichero se grabe como PCX Monocromo
Sigue el desarrollo de mi motor RPG: https://www.youtube.com/watch?v=TbsDq3RHU7g

process main()
       begin
           loop
               pedo();
               frame;
            end
       end

SplinterGU

en el foro alguien puso un algoritmo de dither y el formato pcx es muy simple y lo encontras en internet, con eso ya podes armarte una simple implementacion para lo que necesitas.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Yawin

Del formato pcx no hay tanto como parece en internet.

Y qué es eso de Algoritmo de dither??
Sigue el desarrollo de mi motor RPG: https://www.youtube.com/watch?v=TbsDq3RHU7g

process main()
       begin
           loop
               pedo();
               frame;
            end
       end

SplinterGU

#5
el algoritmo de dither pasa una imagen a color en blanco y negro (2 colores)

en realidad es un algoritmo que sirve para bajar la cantidad de colores de un grafico, reemplazando los colores inexistentes por una mezcla de pixels de colores que si existen, pero se usa (usaba) mucho para convertir de color a blanco y negro.

la primera busqueda que aparece en google si pones "formato pcx" es

http://es.wikipedia.org/wiki/PCX

ahi tenes la info necesaria.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Yawin

Creo que no me explico bien. A ver...
No tengo problemas con pasarlo a blanco y negro. el algoritmo me funciona fetén:

            for (int x = int.Parse((bmp2.PhysicalDimension.Width - 1).ToString()); x >= 0; x--)
            {
                for (int y = int.Parse((bmp2.PhysicalDimension.Height - 1).ToString()); y >= 0; y--)
                {
                    bmp2.SetPixel(x, y, bmp3.GetPixel(x, y));
                }
            }
            for (int x = int.Parse((bmp2.PhysicalDimension.Width - 1).ToString()); x >= 0; x--)
            {
                for (int y = int.Parse((bmp2.PhysicalDimension.Height - 1).ToString()); y >= 0; y--)
                {
                    Color col = bmp2.GetPixel(x, y);

                    int media = (col.R + col.G + col.B) / 3;
                    media = (media * 100) / 255;

                    if (media > por)
                    {
                        col = Color.White;
                    }
                    else
                    {
                        col = Color.Black;
                    }

                    bmp2.SetPixel(x, y, col);
                }
            }
            pictureBox1.Image = bmp2;


Tampoco tengo problemas para guardarlo en .PCX

Mi problema está en que aunque sea blanco y negro y sea .pcx la impresora me dice que la imagen, el archivo, no es monocromo.
Sigue el desarrollo de mi motor RPG: https://www.youtube.com/watch?v=TbsDq3RHU7g

process main()
       begin
           loop
               pedo();
               frame;
            end
       end

SplinterGU

#7
pues caramba...

si que tienes problemas para grabarlo, porque el byte 3 de la cabecera indica como es el archivo, para monocromo, no tenes que solo pasarlo a blanco y negro, sino que tenes que setear el byte 3 (empezando a contar desde 0) a 1, para indicar que es 1bit por pixel, y por ende monocromo.

demas esta decir que no lo podes hacer en el mismo bmp, porque el bmp original no es de 1bpp... como veo estas haciendo en el codigo que pegaste.

el destino (monocromo) debe ser de 1bpp.

aca tenes otro link

http://courses.engr.illinois.edu/ece390/books/labmanual/graphics-pcx.html

por otro lado te recomiento el algoritmo de dither, eso de poner un color u otro en base a la media, va a hacer que muchas imagenes directamente no aparezcan o aparezcan como una mancha negra.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Yawin

Gracias, miraré ese link en cuanto llegue a casa (esque ya acabo de trabajar).

Y no voy a usar ese algoritmo porque:
El usuario tiene una trackbar para nivelar la cantidad de negro. Ten en cuenta que este programa no va a trabajar con degradados y cosas así, sino con logos de empresas. Los logos no suelen tener más de 3 colores.
Sigue el desarrollo de mi motor RPG: https://www.youtube.com/watch?v=TbsDq3RHU7g

process main()
       begin
           loop
               pedo();
               frame;
            end
       end

SplinterGU

mas alla de lo que quieras hacer es bueno completar la informacion al respecto...

aca hay una clara imagen de lo que vos estas haciendo...



en el grafico anterior, se muestra la imagen original, la imagen de 1bit truncado (o umbral), y la imagen de 1bit dithered... la diferencia es clara...

si los logos pueden tener mas de 2 colores entonces (en mi opinion) es necesario que pongas una buena conversion, ademas de que el algoritmo es sumamente estupido...

aca pongo mas imagenes...



otra



ampliada



original



links

http://www.uv.es/gpoei/eng/Pfc_web/generalidades/dithering.htm

bien, en fin, tu decides que usar, aca estan explicados y mostrados los resultados de la tecnica y la informacion para que puedas hacer un pcx monocromo.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Fede

Si quieres ser sabio, aprende a interrogar razonablemente, a escuchar con atención, a responder serenamente y a callar cuando no tengas nada que decir.

Drumpi

Yo creo que es porque usa una librería externa para convertir a PCX. Es probable que coja esa imágen y, aunque use 2 colores, la guarde a 16 o 24 bits de color. Mira a ver qué te dicen otros programas de ediciónde imágen sobre los PCX generados, si son de 1bit o de más.
Sólo tendrías que mirar cómo se crean mapas de 1 bit con esa librería o, en última instancia, crearte tu propio algoritmo de guardado, no parece un formato demasiado complicado de implementar.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

SplinterGU

drumpi, si miras el codigo esta haciendo esto

color = get_pixel(mapaoriginal, x, y)
convertir color a 2 colores
put_pixel(mapaorigina,x,y,nuevocolor)

como se ve, usa mapaoriginal (bmp2) y si mapaoriginal es un un RGB (16 o mas bpp) nunca lo podra grabar a 1bpp sin convertirlo.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

l1nk3rn3l

#13
http://www.imagemagick.org/script/formats.php

http://es.kioskea.net/faq/2363-imagemagic-editar-imagenes-desde-la-linea-de-comandos

http://www.imagemagick.org/Usage/quantize/#monochrome

ese mismo soporta c# y linea de comandos sino quieres meterte con codigo


aqui las funciones principales (es un monstruo esta libreria)
http://www.imagemagick.org/Usage/


permite usar el api desde c++ / c# / php y otros , pero recomiendo mejor
usar la linea de comandos y que el mismo "convert.exe" se encargue de todo
solo preocupate de generar un bmp desde c# jejejeje, lo cual es inmediato..

Yawin

Quote from: SplinterGU on April 11, 2011, 06:31:44 PM
drumpi, si miras el codigo esta haciendo esto

color = get_pixel(mapaoriginal, x, y)
convertir color a 2 colores
put_pixel(mapaorigina,x,y,nuevocolor)

como se ve, usa mapaoriginal (bmp2) y si mapaoriginal es un un RGB (16 o mas bpp) nunca lo podra grabar a 1bpp sin convertirlo.
No verás, lo que hago es:
Cargo en un bitmap una imagen
color = get_pixel(mapaoriginal, x, y)
put_pixel(nuevo bitmap,x,y,mismo color)

Y luego ya:
color = get_pixel(mapaoriginal, x, y)
convertir color a 2 colores
put_pixel(mapaorigina,x,y,nuevocolor)

Esqye si no, me decía todo el rato que el otro fichero estaba abierto.
Sigue el desarrollo de mi motor RPG: https://www.youtube.com/watch?v=TbsDq3RHU7g

process main()
       begin
           loop
               pedo();
               frame;
            end
       end