Wiki

Tutoriales Programacion Cargar datos Imagenes

Nota: esta página está basada en datos que salieron de este hilo del foro:
escena.org/forums/topic/1220/?page=1

Caso general

Existen varias posibilidades para leer imágenes externas, la mayoría de ellas consisten o bien en incluir una librería dedicada a manipular imágenes en diversos formatos (que puede ser un poco excesivo si sólo utilizas un par de formatos), o bien incluir un trozo de código que te permita cargar un formato concreto.

stb_image

Una librería sencilla para cargar imágenes es stb_image: www.nothings.org/stb_image.c

El código fuente consiste en un simple fichero, así que debería ser sencillo utilizar la librería "tal cual", o tomar sólo las partes que nos interesen.

soil

Sin embargo, si estamos utilizando OpenGL para los gráficos quizá nos interesa más utilizar otra librería construida con stb_image como base: SOIL (Simple OpenGL Image Library):
www.lonesock.net/soil.html

Esta última es capaz de crear las texturas OpenGL, tiene soporte para cubemaps, etc.

devil

Una librería que se usa muchisimo openil.sourceforge.net/projects.php, multiplataforma etc etc, que trae algunas funciones basicas de procesado (resize, blur, etc). Ver la página de features openil.sourceforge.net/features.php

DirectX

Si estamos usando DirectX, hay una instrución que puede ser útil:

D3DXGetImageInfoFromFileInMemory(myArray, sizeof(myArray), &imageInfo);

Ejemplo de uso en el contexto:

// Cargar Fondo -----------------------------------------------------------
IDirect3DSurface9* fondo = NULL;
D3DXIMAGE_INFO imageInfo;

D3DXGetImageInfoFromFileInMemory(myArray, sizeof(myArray), &imageInfo);
        
pDevice->CreateOffscreenPlainSurface(
  imageInfo.Width, imageInfo.Height, D3DFMT_X8R8G8B8, D3DPOOL_DEFAULT, &fondo, NULL);
    
D3DXLoadSurfaceFromFileInMemory(
  fondo, NULL, NULL, myArray, sizeof(myArray), NULL, D3DX_DEFAULT, 0, NULL);

Intros 64k

Aunque desaconsejable por cuestión de eficiencia espacial, también puedes cargar imágenes en intros 64k.

JPG

JPG es un formato muy ineficiente (entrarían una o dos imágenes, no más), y de hecho, repite funcionalidad que el mismo compresor que se utiliza para reducir el tamaño de la intro al mínimo (el kkrunchy) ya posee (la compresión huffman). Una posibilidad es construir algo reducido con wavelets (tipo jpg2000), pero adaptado a la intro en concreto.

GIF

El código para cargar un GIF es muy chiquito, y aún se podría reducir más si cabe. Ejemplo de intro que lo utiliza: Softworld
www.pouet.net/prod.php?which=5339

Retocando las imagenes en tamaños tales como 32x32,64x64,128x128 se pueden conseguir cosas bastante vistosas. (Kneda debería aclarar esto último)

De todas formas, con GIF ocurre lo mismo que con JPG, la compresión que lleva añade una redundancia a la compresión que ya aplica kkrunchy, así que es mejor utilizar una imagen sin comprimir antes que JPG o GIF, y dejar que kkrunchy comprima el total mucho más.

BMP/TGA/RAW

Otra alternativa es utilizar las imágenes sin comprimir a las que nos referimos en la opción anterior, pero procesándolas un poquito antes:

  1. bajar la textura de resolución a 128x128 o 64x64
  2. bajar el color de 24bits a 256 o 64 colores
  3. exportarla en BMP/TGA de 8bits no comprimido (el formato es fácil de leer)
  4. meterla a saco como datos binarios

Los pasos 1 al 3 se pueden hacer con cualquier programa de gráficos.

El paso 4 se hace con una herramienta que lee el fichero y te genera un .c con los datos en forma de array listo para compilar y linkar en tu ejecutable.

procedural

Para intros es recomendable generar los gráficos si es posible, mediante técnicas procedurales, vectoriales, o combinación de ambas.

Esta página es el resultado del esfuerzo de los siguientes autores. El número entre paréntesis corresponde a la cantidad de versiones con las que cada usuario ha contribuido:

sole (4), iq (1)