Subiendo Imagenes a OpenSimulator

Una de las tareas que tengo que hacer es poder subir una serie de imagenes automaticamente a OpenSimulator, asi que me di a la tarea de buscar como hacerlo y hacer un pequeño programa que ilustre los pasos que se deben seguir.

Se deben tener algunas consideraciones antes de comenzar, la primera es con respecto al tamaño de las imagenes, las cuales deben tener un tamaño divisible por dos y deben ser cuadradas o rectangulares respetando ciertas reglas en la relacion del ancho y el alto, tambien se debe tener encuenta que una imagen mayor a 1024 pixeles se considera muy grande y es dificil de cargar en el cliente, se recomiendan tamaños como 256×256, 512×512.

Para mayor informacion :
http://wiki.secondlife.com/wiki/Image_System
Image Sizes for Second Life

Tambien debemos tener encuenta el formato de codificacion de la imagen, ya que el cliente utiliza imagenes JPEG-2000, si se tiene un editor de imagenes que genere este formato es ideal utilizarlo, pero la mayoria de las veces las imagenes a subir estan en formatos PNG,JPG entre otros, por lo que se debe convertir la imagen utilizando por ejemplo la libreria openjpeg.

Imagen a Subir

Imagen a Subir

La imagen a utilizar como prueba tiene formato PNG y un tamaño de 512×512

Escribir el Programa :

  • Abrir una consola
  • Crear el directorio para nuestro programa
    mkdir ImageUploader
    cd ImageUploader
  • Copiar las dlls necesarias de la libreria libopenmetaverse compiladas anteriormente
    cp <directorio libopenmv>/trunk/bin/OpenMetaverse.dll .
    cp <directorio libopenmv>/trunk/bin/OpenMetaverseTypes.dll .
    cp <directorio libopenmv>/trunk/bin/OpenMetaverseTypes.dll.config .
    cp <directorio libopenmv>/trunk/bin/OpenMetaverse.StructuredData.dll .
    cp <directorio libopenmv>/trunk/bin/log4net.dll .
    cp <directorio libopenmv>/trunk/bin/openjpeg-dotnet.dll .
  • Crear el programa en C#
    vi ImageUpload.cs

    using System;
    using System.Drawing;
    using OpenMetaverse;
    using OpenMetaverse.Capabilities;
    using OpenMetaverse.Imaging;
    
    public class ImageUploader {
    	public static void Main(string[] args) {
    
    		// Realizar el login
    		GridClient client = new GridClient();
    		LoginParams loginParams = client.Network.DefaultLoginParams(
    			"Juan","Perez","1234","ImageUploader","0.1");
    		loginParams.URI = "http://192.168.1.3:9000";
    		if(!client.Network.Login(loginParams)) {
    			Console.WriteLine(client.Network.LoginMessage);
    			return;
    		}
    
    		// Convertir imagen a JPEG-2000
    		Bitmap bitmap = (Bitmap) System.Drawing.Image.FromFile("OpenSIM_01.png");
    		byte[] data  = OpenJPEG.EncodeFromImage(bitmap,false);
    
    		// Obtener el identificador del directorio de las texturas
    		UUID folderID = client.Inventory.FindFolderForType(AssetType.Texture);
    
    		// Crear un nuevo item con los datos de la imagen, en el directorio de texturas
    		client.Inventory.RequestCreateItemFromAsset(data,"image01","Image Upload"
    			,AssetType.Texture,InventoryType.Texture,folderID
    			,delegate(CapsClient capsClient, long bytesReceived,
    				long bytesSent, long totalBytesToReceive, long totalBytesToSend) {
    				if(bytesSent > 0)
                                    	Console.WriteLine(String.Format("Texture upload: {0} / {1}",
    						bytesSent,totalBytesToSend));
    			}
    			,delegate(bool success, string status, UUID itemID, UUID assetID) {
                            	Console.WriteLine(String.Format(
                                    	"RequestCreateItemFromAsset() returned: Success={0}, Status={1}, ItemID={2}, AssetID={3}",
                                    	success, status, itemID, assetID));
    			}
    		);
    
    		// Salir
    		client.Network.Logout();
    	}
    }
  • Compilar el programa :
    gmcs -lib:. -r:System.Drawing,OpenMetaverse.dll,OpenMetaverseTypes.dll ImageUploader.cs
  • Ejecutar el programa :
    mono ImageUploader.exe

Al momento de ejecutar el programa una excepcion fue lanzada :
Unhandled Exception: System.DllNotFoundException: libopenjpeg-dotnet-2.1.3.0-dotnet-1

Se debe a que no tenemos la libreria de enlace entre openjpeg y .NET, la busque en la distribucion del la libreria pero no la encontre asi que la descargue de internet al directorio.

  • wget http://opensimulator.org/svn/opensim/trunk/bin/libopenjpeg-dotnet-2.1.3.0-dotnet-1.so

Ahora podemos ejecutar el programa otra vez :

marlonj@blackbox:~/tmp/MyBot$ mono ImageUploader.exe
47 [1] INFO  - No log configuration found, defaulting to console logging
521 [2] INFO  - : Connecting to (192.168.1.3:9000)
673 [3] INFO  - : Received a region handshake for OpenSim Test (192.168.1.3:9000)
752 [4] WARN  - : Received a duplicate of packet #2, current type: ParcelOverlay
1229 [1] INFO  - : Logging out
Texture upload: 4096 / 91313
Texture upload: 4096 / 91313
Texture upload: 4096 / 91313
Texture upload: 4096 / 91313
Texture upload: 4096 / 91313
Texture upload: 4096 / 91313
Texture upload: 4096 / 91313
Texture upload: 4096 / 91313
Texture upload: 4096 / 91313
Texture upload: 4096 / 91313
Texture upload: 4096 / 91313
Texture upload: 4096 / 91313
Texture upload: 4096 / 91313
Texture upload: 4096 / 91313
Texture upload: 4096 / 91313
Texture upload: 4096 / 91313
Texture upload: 4096 / 91313
Texture upload: 4096 / 91313
Texture upload: 4096 / 91313
Texture upload: 4096 / 91313
Texture upload: 4096 / 91313
Texture upload: 4096 / 91313
Texture upload: 1201 / 91313
RequestCreateItemFromAsset() returned: Success=True, Status=, ItemID=ecd6a5e5-24b9-415b-b57d-07a87c674c65, AssetID=226c7ea3-8f57-4a87-88af-960593dc1db0
6231 [1] INFO  - : NetworkManager shutdown initiated
6232 [1] INFO  - : Caps system for OpenSim Test (192.168.1.3:9000) is aborting
Advertisement

~ por marlonj en diciembre 8, 2008.

Deja un comentario

Fill in your details below or click an icon to log in:

Logo de WordPress.com

You are commenting using your WordPress.com account. Log Out / Cambiar )

Twitter picture

You are commenting using your Twitter account. Log Out / Cambiar )

Facebook photo

You are commenting using your Facebook account. Log Out / Cambiar )

Connecting to %s

 
Seguir

Get every new post delivered to your Inbox.