Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Gráficos (https://www.clubdelphi.com/foros/forumdisplay.php?f=8)
-   -   Escala de grises (https://www.clubdelphi.com/foros/showthread.php?t=53806)

andarcio 01-03-2008 08:04:25

Escala de grises
 
alguien sabe como puedo poner un bitmap en una configuracion de escala de grises. Explico:

estoy cargando y mostrando imagenes (muchas..) de forma rapida.estas estan en formato .tiff (en escala de grises - 8 bit por color), asi que lo que estoy haciendo es moviendolas con (move) de una direccion en memoria a un bitmap con la propiedad "bitmap.PixelFormat:= pf8bit". y todo bien excepto por la escala..., que ya no es gris.

si alguien me pudiera dar alguna idea

gracias

ixMike 01-03-2008 15:07:12

En un bitmap, pf8bit se refiere a colores de 8 bits, es decir, 256 colores. Creo que lo que tendrías que hacer es esto (porque me parece que Bitmap no soporta escala de grises).

Cada punto del TIFF tiene un valor de 0 a 255, para indicar la tonalidad de gris. Pues bien, el equivalente en Bitmap sería color de 24bits, donde tanto rojo, como verde, como azul tendrán el mismo valor del TIFF (en cada punto). Mejor explicado, si un pixel del TIFF tiene valor 80, pues entonces el pixel equivalente en Bitmap sería R=80,G=80,B=80.


Salu2.

andarcio 01-03-2008 20:05:08

ok
Pero como dije antes utilizo el procedimiento "move" y "Scanline" para obtener velocidad, si hago lo que me sugieres entonces tendria que preparar cada vector fila de las imagenes que manipulo. esto me tomaria bastante tienpo y triplicaria el espacio en memoria,

agradezco la propuesta, y sobre todo agradeceria alguna otra.

gracias

ixMike 01-03-2008 21:51:03

Me lo imaginaba... Bueno, una alternativa para ganar algo de velocidad sería implementarlo en ensamblador... si algún alma caritativa se presta a la labor...:o

Delphius 01-03-2008 22:15:46

Hola andarcio,
¿Podrías darnos una muestra de código de como estás haciendolo?

Además podrías ser más específico cuando dices:

Cita:

estoy cargando y mostrando imagenes (muchas..) de forma rapida
Muy seguramente habrá una solución... pero para llegar a eso necesitamos concer con más detalles lo que estás haciendo.

Otra alternativa es que en vez de tener las imagenes en .tiff la tengas en el equivalente RGB como menciona ixMike. De módo que sólo bastaria con mostrarlas.

Saludos,

cHackAll 02-03-2008 01:07:10

andarcio; como te comentó ixMike lo que intentas cambiando el PixelFormat a 8 no te dara resultado por lo ya expuesto. Como tambien comentaba ixMike, para hacer una escala de grises debes "igualar" cada color del RGB, algo como:
Código Delphi [-]
...
 Color := Pixel[y,x];
 Gray := (GetRValue(Color) + GetGValue(Color) + GetBValue(Color)) div 3;
 Pixel[y,x] := RGB(Gray, Gray, Gray);
...

Te dejo el Truco 433, independientemente de la conversión de formatos y el redimencionamiento es exactamente lo que necesitas.

Saludos

ixMike 02-03-2008 01:19:12

Una duda, ¿cómo lees el archivo TIFF?

andarcio 03-03-2008 00:45:33

Gradezco sus respuestas

aqui les mando algo de codigo que utilizo,

primero creo un tipo de datos

type tpimg=^timg;
timg =record
a:array[0..alto] of array[0..ancho] of byte;
end;


despues ago un arreglo de este type

pimg:array of tpimg;

inicializo (segun un Array de direciones dado en lisbox1.items)
//aqui es donde leo los .tiff
[i]setlength(pimg,ListBox1.items.count);
for i:=0 to ListBox1.items.count-1 do
begin
New(pimg[i]);
assignfile(f,ListBox1.items);
reset(f);
seek(f,2048); //
salto los comentarios del tiff
[i] for j:=0 to 423 do
blockread(f,pimg[i]^.a[j],sizeof(pimg^.a[j]));
end;

ahora los muestro el selecionado que es >0 y <listbox1.count
BitMap := TBitMap.create;
bitmap.PixelFormat:= pf8bit;
try
BitMap.Height:=alto;
bitmap.Width:=ancho;
for y:=0 to BitMap.Height -1 do
begin
P := BitMap.ScanLine[y];
move(pimg[seleccionado]^.a[y],p^,sizeof(pimg[seleccionado]^.a[y]));
end;
image1.Canvas.Draw(0,0,BitMap);
finally
BitMap.Free;
end;
nota1: no solo las muestro sino que trabajo con todo el conjunto de imagenes
ej.(promedio de estas).
nota2: la solucion momentanea que he dado, es crear memoria solo a la hora de mostrarlas, pero es considerablemente lento,

espero que les sirva y que me puedan ayudar

slds


La franja horaria es GMT +2. Ahora son las 10:56:25.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi