Obtener iconos grandes
Pues de nuevo dando una pequeña lata por aquí, verán yo uso “SHGetFileInfo” para extraer los iconos de algunas aplicaciones o documentos de Windows, el problema es que yo quisiera obtener los iconos con alta resolución, como de unos 128x128 ó 256x256(que son los que ya maneja el vista), para mostrarlos en un TImage, es esto posible?
O que por favor alguien me diga como poder cambiar el tamaño de los iconos sin comprometer demasiado la calidad de estos. Estoy trabajando en c++ builder 2007, pero cualquier respuesta es buena. De antemano gracias. |
Los iconos en cualquier resolucion de un archivo binario están almacenados en su seccion de recursos, te aconsejo comenzar a buscar en el foro la extracción de recursos de un binario.
Saludos |
Pues gracias cHackAll, lo que sucede es que también me gustaría mostrar los iconos de algunas extensiones como por ejemplo txt, y en este caso de donde obtengo los iconos en alta resolución ya que estos no tienen archivos de recursos y con “SHGetFileInfo” solo me los da con una resolución de 16x16.
|
Te recomiendo te eches una vuelta por photostock, tienen una biblioteca enorme de diferentes ilustraciones y dibujos que puedes convertir en íconos facilmente. Puedes usar el programa IcoFX que es gratuito para editarlos, es muy sencillo de usar y te permite generar íconos como los que necesitas.
No tengas miedo de hacer tus propios íconos, no es tan dificil y sin duda le daras tu propio toque a tus aplicaciones. |
pues gracias AzidRain, pero la cosa no es falta de iconos de hecho yo uso el “icon craft” para este fin(muy bueno por cierto), lo que intento es obtener los que tiene el sistema por defecto para no confundir al usuario con mis iconos, además de que es imposible que ponga todos los iconos de las extensiones dentro de mi aplicación.
|
Aquí tienes un ejemplo de como manejar iconos en la sección de recursos de un ejecutable o dll.
Cita:
Saludos. |
gracias escafandra por el ejemplo, y si ya probé “ExtractAssociatedIcon” pero al igual que “SHGetFileInfo” solo me devuelve iconos de 16x16, y en cuanto a recursos ya mencione mas arriba que también querría los iconos de las exenciones por ejemplo de un txt, doc o pdf, con una resolución de al menos 64x64.
|
Probaron ambos dicha API? ExtractAssociatedIcon es del namespace System.Drawing... .NET!
|
Yo si que la probe y va perfecto en win 32, pero solo da los iconos en 16x16.
Código:
HICON ExtractAssociatedIcon( |
Cita:
Entonces; lo unico que queda es analizar los recursos. PD; Cita:
Suerte! |
Pues estoy devuelta después de estudiar un poco la función “LoadImage” que dejo cHackAll(gracias), y después de eso sigo sin poder extraer los iconos de las diferentes extensiones con una calidad aceptable, lo único que he logrado es obtenerlos de ejecutables y dll, pero hasta ahí. Me pregunto si abra una forma de darle el icono a la función “LoadImage” para redimensionarlos.
|
_cero_, ¿has intentado leer los iconos con ExtractAssociatedIcon pero especificando el índice que quieres? (lpicon). No puedo probarlo ahora, estoy en un ordenador que no tiene instalado el compilador. Se me ocurre que los leas uno a uno y compruebes el tamaño en un bucle hasta que encuentres el que deseas.
Saludos.:rolleyes: |
Eso es una muy buena propuesta escafandra, ya lo avía intentado cambiando LPWORD lpiIcon, pero solo le di valores enteros (como 1, 10, 2, etc.) Y como no me funciono y además no sabía bien qué onda con los índices lo deje, así que si me pusieras un ejemplillo de cómo hacer lo que propones te lo agradecería mucho.
|
Pues miren logre conseguir un icono de 32x32, con el siguiente código.
función. Código:
UINT ExtractIconEx( Código:
HICON hIcon; |
Ya profundice mas en este tema, y me quedo claro que un exe o dll pueden tener más de un icono y el índice es el numero que identifica a cada icono, ahora bien como saben un icono puede tener barias imágenes dentro de este, así que mi pregunta es de cómo puedo accesar a estas imágenes que están dentro del icono.
Les dejo una imagen por si no queda claro de a que estoy intentando accesar. http://www.subirimagenes.com/otros-captura-1646462.html |
_cero_ Estuve probando los índices en ExtractAssociatedIcon y no he obtenido el resultado deseado. Sólo devuelve un hIcon 32x32.
Cita:
De todas formas he cotilleado SHELL32.dll con un editor de recursos y los iconos de 48x48 están, tiene muchos mas iconos que los que muestra cuando tratas de personalizar el icono mostrado por una carpeta, por ejemplo. Bueno, ¿y si del Registro sacamos el default icon de un tipo de archivo?. Por ejemplo HKEY_CLASSES_ROOT\txtfile\DefaultIcon = %SystemRoot%\system32\shell32.dll,-152 se puede leer como un resource, 152 es el grupo de iconos correspondiente al notepad y archivos de extensión asociada a este programa. Basta leerlos y obtener el del tamaño que te interesa. Claro, esta es una solución que puede funcionar muy bien pero es un poco trabajosa. He buscado en la Red y este problema lo ha encontrado mucha gente.... Quizas una búsqueda mas a fondo de con una solución mas simple. :rolleyes: Saludos. |
Cita:
Código:
//--------------------------------------------------------------------------- Código:
//--------------------------------------------------------------------------- |
Pues muchas gracias escafandra, la función que dejaste se ve interesante, pero me gusto mas la idea que presentaste sobre obtener la dirección e índice del icono de una extensión desde el registro (muy buena idea, yo ni si quera sabia que se podía), así podría extraer y guardar los iconos que use en una especie de cache, y para obtener el tamaño de la imagen que quiero solo usaría el siguiente código.
Código:
Image1->Picture->Icon ->Handle=LoadImage(NULL, "C:\\txt.ico", |
Solo una cosa mas, esta forma de asignar la imagen del icono:
Código:
Image1->Picture->Icon ->Handle = hIcon; Para solventar este problema escribí una función que mapea un HICON en memoria según un HDC concreto. Si en tu Builder 2007 no tienes ese problema, pues perfecto. Si es así dímelo. Saludos.:) PD: La idea de cHackAll: Cita:
|
Pues no quería contestar hasta que tuviera una función concreta, pero me he atorado en la extracción del icono de los recursos a un archivo .ico, ya intente la función que dejo escafandra, pero no le entiendo mucho asi que por favor, me podrían ayudar con la extracción de un icono (ahora si proveniente de un exe o dll), a un directorio digamos "C:\".:confused::confused::confused::confused:
|
Cita:
Te dejo mas código que te sirve para lo que pretendes (vas a terminar con mi arsenal:p): Para extraer un mapa de memoria del icono en formato archivo.ico Código:
//------------------------------------------------------------------------------ Código:
//------------------------------------------------------------------------------ |
Lo que pasa es que cuando yo trabajaba con los recursos de mi aplicación usaba “TResourceStream” y “TFileStream” para extraer algo de los recursos a un archivo x, pero creo que esto no se puede usar con recursos ajenos, entonces intento usar “FindResource” y “LoadResource” para cargar los recursos ajenos, y aquí es donde me atoro porque sé que “LoadResource” regresa la dirección de estos recursos, pero como puedo trabajar con este resultado?, lo puedo asignar a un Ticon o algo parecido?.
pd. Gracias por el código escafandra, ya lo estoy estudiando. |
Bueno LoadResource te devuelve un HGLOBAL. No lo he probado, pero seguro que ese puntero es un LPGRPICONDIR. De las funciones que te he dejado, ExtractResIconFromModule te devuelve un puntero tipo LPGRPICONDIR.
No termino de entender lo que quieres hacer :confused: :confused:, pesé que querías guardar en un archivo.ico una imagen de un icono extraído de un resource de dll o exe. Si es así la respuesta esta aquí. Saludos. |
Pues gracias por todo escafandra, ya implemente las funciones que dejaste y tuve que declarar algunas estructuras (y no sé si lo hice correctamente, pero no me funciono hasta que lo hice), no sé si es por esto que “SaveResIconToFile” me devuelve false y no me crea el icono, pero al menos ya tengo con que orientarme y seguirle intentando para extraer los iconos gracias.
Aquí los tipos que declare: Código:
typedef struct |
Si creí que tenias claro de donde salían las definiciones de las estructuras usadas. Yo tengo esto en un archivo que denomino iconos.h:
Código:
#ifndef iconosH Código:
// Necesario para alinear a Word el compilador Prueba como te digo, funciona. Saludos.;) |
Pues estoy de vuelta, solo para agradecer ya que las funciones que dejo escafandra me van de maravilla, y me regresaban falso porque no encontraban el recurso, así que lo único que tuve que hacer es cambiar el Id de tipo int a tipo char, y así sí que jalo. ahora solo le estoy asiendo unas pequeñas modificaciones para que me dé el icono por su posición y no por su nombre (pero eso ya lo hago yo si no, no aprendo).:D:o:D
|
Me alegro de que lo consigas. No te olvides de postear tus soluciones, Siempre servirán a mas gente.
Saludos.;) |
Pues regreso para reportar mis avances y dejarles esta nueva función, en parte basada en las funciones que nos proporciono amablemente escafandra, solo que esta recorre todos los recursos del tipo icono y con un contador(numme), que es el que se encarga de identificar el icono que deseo extraer.
Código:
bool CALLBACK ResNameProc(HANDLE hModule, LPCTSTR lpType,LPTSTR lpszName,LONG lpName) Código:
HMODULE hModule=LoadLibrary("C:\\ShowTime.exe"); Código:
FindResource(hModule, |
Bien _cero_. Ya que entraste en el tema de enumeración de los resources, te dejo esto:
Código:
//------------------------------------------------------------------------------ PD: Una aclaración sobre las funciones que dejé anteriormente. El indice para encontrar el icono, como explico es un indice como si de una matriz se tratara. La Función FindResource que usan no es la API sino una nueva que añado en este post. Siento no haberme dado cuanta hasta ahora que no la había proporcionado, por eso no iban bien los índices.:o:p en las funciones posteadas. |
Pues ya quedo, les dejo el código aquí para que lo descarguen, ya que la solución está formada por tres funciones muy extensas y me pareció mejor subir fuentes que escribir todo el código aquí. Nos vemos y gracias por su ayuda, en especial a escafandra.
|
La franja horaria es GMT +2. Ahora son las 11:47:38. |
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