Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > API de Windows
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 01-12-2009
Avatar de bosster_018
bosster_018 bosster_018 is offline
Miembro
 
Registrado: nov 2009
Ubicación: Bolivia
Posts: 127
Poder: 15
bosster_018 Va por buen camino
Smile 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
Responder Con Cita
  #2  
Antiguo 26-12-2009
Avatar de bosster_018
bosster_018 bosster_018 is offline
Miembro
 
Registrado: nov 2009
Ubicación: Bolivia
Posts: 127
Poder: 15
bosster_018 Va por buen camino
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.

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.
Responder Con Cita
  #3  
Antiguo 28-12-2009
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
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.
Responder Con Cita
  #4  
Antiguo 04-01-2010
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
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.
Responder Con Cita
  #5  
Antiguo 05-01-2010
Avatar de bosster_018
bosster_018 bosster_018 is offline
Miembro
 
Registrado: nov 2009
Ubicación: Bolivia
Posts: 127
Poder: 15
bosster_018 Va por buen camino
Muchas gracias

Muchas gracias Escafandra...

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

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...

Pdt.:

Estoy un poco mareado con tanto código (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 .

Les aviso después como me fué...
Saludos
Responder Con Cita
  #6  
Antiguo 05-01-2010
cocute cocute is offline
Miembro
 
Registrado: nov 2008
Posts: 403
Poder: 16
cocute Va por buen camino
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.
Responder Con Cita
  #7  
Antiguo 05-01-2010
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Cita:
Empezado por cocute Ver Mensaje
...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.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Porque me sale cada rato un Warning "ibase_fetch_assoc()" al Guardar ???? AGAG4 PHP 6 09-09-2008 23:40:25
Como hacer que se vea "Si" en vez de "TRUE" en un DBGrid lu9eui C++ Builder 2 07-08-2007 04:03:13
qreport no "renderea" correctamente moris Impresión 1 09-01-2007 04:50:52
¿Como Guardar un "RECORD" en un campo BLOB? sitrico Conexión con bases de datos 5 29-06-2004 17:32:01


La franja horaria es GMT +2. Ahora son las 16:11:01.


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
Copyright 1996-2007 Club Delphi