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.
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.csusing 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
Me gusta:
~ por marlonj en diciembre 8, 2008.
Escrito en Cacharreos
Etiquetas: libopenmetaverse, opensim, opensimulator







