Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Guardar correctamente un icono como ".ico" (https://www.clubdelphi.com/foros/showthread.php?t=65250)

bosster_018 01-12-2009 01:20:15

Guardar correctamente un icono como ".ico"
 
Un saludo grande a todos ustedes...
Tengo una duda desde hace tiempo que no puedo llegar a solucionar.

¿Cómo puedo guardar correctamente un icono desde mi aplicación?
¿Parece sencillo, no ? ¿Ya estoy oyendo (SaveToFile )?

Empezaré por el principio.... Tengo una funcion para extraer el "Icono" de cualquier programa en una Timagen:

(Sacada desde el ClubDelphi)

Primero en mi formulario agrego una Timagen y luego un boton.
En el boton escribo:

Código Delphi [-]
Uses
  ShellApi

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
  Icono:  TIcon;
begin
  Icono := TIcon.Create;
  //Extraer el icono de una aplicación, en este caso la calculadora de Windows
  Icono.Handle := ExtractIcon(hInstance,'calc.exe',0);
  Image1.Picture:= TPicture(Icono);
  //¿Como guardo esta imagen del icono como .ico?
  Image1.Picture.SaveToFile('boss.ico');
  Icono.Free;
end;


Pero si lo prueban, verán que al guardar la imagen del icono, esta se guarda como...... En blanco y negro, casi sin color.

Así que mi pregunta es ¿cómo guardar este icono extraído en una Timagen con una buena resolución gráfica?

Gracias por su tiempo queridos amigos del ClubDelphi

bosster_018 26-12-2009 04:01:57

Añadiendo lo investigado
 
Por lo visto este tema se ha tratado muchas veces en el ClubDelphi...

No solucionado
Solucionado Pero no pude comprender esa página Rusa
Muy bueno el Vampyre Imaging Library, pero sin resultado

Cómo pueden apreciar las últimas dos páginas pueden ser la solución...
La 2da página que era una página Web Rusa, ponían un código para convertir un Bitmap a ico, pero el código no lo explican ni brindan información al respecto. Por lo que no pude entenderlo.

La tercera página donde recomiendan usar el Vampyre Imaging Library, resulto muy buena opción para trabajar con imágenes en Delphi.
Pero después de leer toda la guía del componente, no pude encontrar una manera de realizar lo pedido.

Luego encontré en Trucomanía, la forma de convertir un icono a Bitmap, que si resultó pero con una complicación, pues la parte que debería ser "invisible" del ícono, se representa como una imagen de color blanco.

Aquí está lo que saque de Trucomania:

//Por si acaso el código es la continuación del procedimiento para "Capturar el icono de una aplicación" que puse arriba.
Código Delphi [-]
procedure TForm1.ConvertirImagen(Icono : String);
var
  Bitmap : TBitmap;
  Imagen : TImage;
begin
  Imagen:= TImage.Create(nil);
  Imagen.Picture:= Image1.Picture;
  Bitmap:= TBitMap.Create;
  with Bitmap do
  begin
    PixelFormat:= pf24bit;
    Height:= Application.Icon.Height;
    Width:= Application.Icon.Width;
    Canvas.Draw( 0, 0, Imagen.Picture.Graphic );
  end;
  Bitmap.SavetoFile(Icono);
  Imagen.Free;
end;


Para llamarlo solo escribes:
Código Delphi [-]
ConvertirImagen('boss.ico'); //Aunque tendría que ser .bmp

Lo malo es que la imagen guardada como ico queda un poco extraña, pero mucho mejor de lo que quedaba antes.

Ahora después de leer esta tediosa explicación, mi pregunta sería:

¿Cómo mejoraría esa inperfección de este código?

Seguiré investigando hasta darle con el clavo. :rolleyes:

Nota.- No quería escribir esto hasta solucionar lo que busco, pero esto sirve como un avance para los que buscan hasta ahora converitir una imagen a ico.
Tambien para actualizar esta pregunta y si alguno ya sabe como hacerlo puedan aportarlo al ClubDelphi.
Pues este procedimiento que quiero realizar no lo necesito actualmente, pero sé que en el futuro me servirá, y sobre todo a muchas personas que necesita una ayuda con Delphi.

escafandra 28-12-2009 17:44:24

El primer código podría resumirse a:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
  Icono:  TIcon;
begin
  Icono := TIcon.Create;
  //Extraer el icono de una aplicación, en este caso la calculadora de Windows
  Icono.Handle := ExtractIcon(hInstance,'calc.exe',0);
  Icono.SaveToFile('C:\icono.ico');
  Icono.Free;
end;

El probleba radica en el mismo delphi pues las conversiones en los iconos las hace a 16 colores. Es posible que las últimas versiones trabajen con mas de 16 colores.

Se puede solucionar. Revisa despacio este hilo: Crear resource icon por código. En especial esta cuestión y esta solución.


Saludos.

escafandra 04-01-2010 12:41:39

Me he tomado la molestia de traducir parte del código publicado en C/C++ a delphi. La parte traducida muestra como guardar correctamente un archivo.ico a partir de su Handle con el suficiente número de colores para no perder información. Aquí lo tenéis.

Espero que sea de utilidad.

Saludos.

bosster_018 05-01-2010 03:17:13

Muchas gracias
 
Muchas gracias Escafandra...

Estoy probando el código, y revisando los otros hilos para entender mejor lo que se hace... :p

Por lo visto, le dedicaste con gran esfuerzo sobre la conversión de iconos, pero el esfuerzo que le dedicas, beneficia a muchas personas...

Muchas gracias por compartir tus conocimientos con nosotros los novatillos... :D

Pdt.:

Estoy un poco mareado con tanto código :eek: (como se nota que todavía estoy en la cuna, comparado con ustedes)

Perdonen si no respondí antes, es que estaba empeñado en otro proyecto que ya va más de 6 meses pero irónicamente era sólo un proyecto para pasar el tiempo :p.

Les aviso después como me fué...
Saludos

cocute 05-01-2010 15:42:06

aunque no tenga que ver propiamente con el tema
por cierto que los iconos para que se vean bien en todas las resoluciones es conveniente que esten guardados en varios tamaños dentro del mismo icono,

para mi el programa IconWorkshop indispensable para esto ya que te lo hace automáticamente.

escafandra 05-01-2010 16:03:48

Cita:

Empezado por cocute (Mensaje 350050)
...los iconos para que se vean bien en todas las resoluciones es conveniente que esten guardados en varios tamaños dentro del mismo icono...

Ciertamente, cocute, en un archivo.ico podemos tener mas de un icono guardado como explico en los enlaces expuestos mas arriba. Las aplicaciones suelen tener también guardadas varias versiones de los iconos en su sección de recursos, precisamente para optimizar la visualización como bien apuntas.

Saludos.


La franja horaria es GMT +2. Ahora son las 12:03:16.

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