Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Impresión (https://www.clubdelphi.com/foros/forumdisplay.php?f=4)
-   -   imprimir imagenes en maxima calidad (https://www.clubdelphi.com/foros/showthread.php?t=32956)

alain 22-06-2006 03:18:24

imprimir imagenes en maxima calidad
 
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
Código Delphi [-]
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...
Código Delphi [-]
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!


La franja horaria es GMT +2. Ahora son las 22:51:04.

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