PDA

Ver la Versión Completa : imprimir imagenes en maxima calidad


alain
22-06-2006, 03:18:24
Hola gente, tengo unas dudas con esto... Necesito imprimir imagenes PNG desde un sistema q estoy desarrollando y queria saber si hay alguna forma de imprimir imagenes que no conozca. Ya probe con
Printer.BeginDoc;
Printer.Canvas.Draw(miImagen);
Printer.EndDoc;

y tambien probre con la funcion "StretchBlt" que creo es de GDI, y en ambos casos los colores de la imagen impresa variaban un poco.
En fin, estoy un poco mareado con esto, y queria saber si pueden recomendarme alguna otra manera de hacerlo, o si existe, algun componente q sirva para hacer esto.
Desde ya, muchas gracias.
Salu2!

Lepe
22-06-2006, 10:22:39
Usa un PrintDialog de la pestaña Dialogs de Delphi, permite elegir la impresora y configurarla para máxima calidad. Recordemos que cada impresora tiene opciones diferentes, llamando a esta ventana, tendremos acceso a todas las propiedades de esa impresora.

Saludos

seoane
22-06-2006, 13:01:05
Cuando dice que los colores variaban, ¿te refieres entre un metdo y otro o con respecto a como se ven en pantalla? Si es lo segundo ten en cuenta que mientras en la pantalla se utiliza una mezcla de Rojo, Verde y Azul para mostrar las imagenes, sobre el papel se utilza una mezcla de Cian, Magenta, Amarillo y Negro. Las impresora inetntan traducir lo mejor posible los colores de un sistema a otro pero el color puede variar un poco. Programas como photoshop utilizan filtro correctores de gama para que los colores se aproxmen lo mas posible, pero hay que clibrarlo para cada impresora.

En cuanto a los imprimir imagenes en el canvas con StretchBlt o metodos parecidos. Ten en cuenta que el canvas de la impresora es un poco "especial" y las operacion con pixeles se le atragantan un poco. Si lo que queremos dibujar es una foto no queda mas remedio, peri si queremos dibujar figuras geometricas, lineas, etc. es mejor hacerlo directamente sobre el canvas de la impresora para tener mas calidad.

alain
22-06-2006, 17:05:50
Bueno, gracias por responder y perdon por no especificar bien mi problema.
Lo del PrintDialog ya lo estoy usando... Con lo de q variaban los colores me referia a las 2 imagenes impresas... Pero lo q q no me di cuenta (mejor dicho, me confundi) es q estaba comparando una imagen impresa con mi sistema y otra impresa con photoshop, ya probe unas cuantas veces y hay un poco de diferencia. Casi no encuentro diferencia haciendo un "Printer.Canvas.Draw" o un "StretchBlt".
Enrealidad mis dudas son con otra cosa. Las imagenes q tengo q imprimir tienen que estar siempre a la misma escala, digamos, si vario los dpi (o ppp) de la impresora no tiene q cambiar el tamaño de la imagen impresa, y para eso es q uso "StretchBlt", q lo q hace es agrandar o achicar una imagen al copiarla de un canvas origen a uno destino (el destino puede ser el canvas de la impresora), y de lo q tengo miedo es q al ampliar la imagen, se deformen los colores o algo por el estilo. Capaz esto de ajustar la escala se vea mejor en mi codigo, capaz es mas simple explicarlo asi...
uses pngimage;
// un componente para manejo de imagenes png libre
procedure TForm1.Button1Click(Sender: TObject);
var
o: TPNGObject; // imagen a imprimir (origen)
impresora: TPrinter;
dpi_foto_h: Integer; //dpi origen, osea las fotos, height
dpi_foto_w: Integer; //dpi origen, osea las fotos, width
d_width: Integer; // ancho q tendra la imagen destino
d_height: Integer; // alto q tendra la imagen destino
dpi_impresora_h: Integer; //dpi q soporta la impresora, height
dpi_impresora_w: Integer; //dpi q soporta la impresora, width
ok: Boolean;
begin
ok:= PrinterSetupDialog1.Execute;
dpi_foto_h:= 300;
dpi_foto_w:= 300;
impresora:= Printer;
o:= TPNGObject.Create;
o.LoadFromFile('C:\mi_imagen.png');

// devuelve el dpi en altura de la impresora
dpi_impresora_h:= GetDeviceCaps(impresora.Handle, LOGPIXELSY);
// devuelve el dpi en ancho de la impresora
dpi_impresora_w:= GetDeviceCaps(impresora.Handle, LOGPIXELSX);

// calculo el ancho de la imagen destino
d_width:= round(o.Width * dpi_impresora_w / dpi_foto_w);
// calculo el alto de la imagen destino
d_height:= round(o.Height * dpi_impresora_h / dpi_foto_h);

impresora.BeginDoc;
impresora.Canvas.Lock;

// copio la imagen a la impresora, agrandandola o achicandola, segun lo calculado arriba
if StretchBlt(impresora.Canvas.Handle, 0, 0, d_width,d_height,
o.Canvas.Handle, 0, 0, o.Width, o.Height,
SRCCOPY) then
ShowMessage('Se agrando con exito')
else
ShowMessage('ERROR al intentar ejecutar el StretchBlt');

impresora.Canvas.Unlock;
impresora.EndDoc;
end;

A ver q les parece, acepto todo tipo de opiniones, criticas.
Salu2!