Anuncios Google

Redimensionar imagen en lua hm7 [Solucionado]

Buenas a todos,

Necesito redimensionar una imagen en lua hm7. Pero, creo, que no hay una función que haga eso. Y un algoritmo de como hacerlo no tengo idea de como sería. Así que les pregunto, ¿Hay algún algoritmo o función el cual redimencione o escale imagenes en lua hm7?

Un saludo y gracias de antemano.


Para recibir ayuda por parte de otros usuarios más rápidamente, recomendamos que pongas títulos descriptivos y no utilices abreviaturas (estilo MSN) en tus post de los foros. Recuerda que accediendo al Manual del perfecto forero y las Normas de la Comunidad aprenderas trucos para resolver tus dudas antes.

No preguntes por MP, mejor pregunta aquí.


Anuncios Google

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de moikop

Gracias a todos.

Al final me quedaré con la función de Trom_Us. Ya que es el que me pareció más efectivo y rápido (=P).
Un saludo y gracias de nuevo.


Para recibir ayuda por parte de otros usuarios más rápidamente, recomendamos que pongas títulos descriptivos y no utilices abreviaturas (estilo MSN) en tus post de los foros. Recuerda que accediendo al Manual del perfecto forero y las Normas de la Comunidad aprenderas trucos para resolver tus dudas antes.

No preguntes por MP, mejor pregunta aquí.

Imagen de DeViaNTe

hm redimensionar imagenes

Sí, lo que habeis puesto son buenas formulas para redimensionar imagenes.

Weno, contando que hm tiene un error en el modo que usa el 3d, no podemos entrar y salir de dibujo 3d cuando keramos, sólo al final de un frame (este homemister...), así que, si nuestra imagen va a estar encima del resto de cosas, bien podríamos utilizar... el gu de la consola.

o sea, para reescalar una imagen, al vuelo, sería:

start3d,
2 vertices, uno arriba izkierda de donde kiere aparecer, o sea, x e y.
vertices del tipo textura, u y v del primer vertice = 0,0. (inicio de nuestra imagen)
el segundo vertice, x + w, y + h (la eskina contraria de la imagen)
u y v = 1,1 (final de nuestra imagen).
Seteamos la imagen como textura.
drawarray de esos dos vertices
Y voilá, super speeded image stretching!
(Con eso ademas se pueden aplicar efectos de tintado, así que es una buena solución)

En el caso de kerer dibujarla debajo de otras cosas, la cosa ya cambia, y lo suyo sería hacer caché de esta imagen ya reescalada, usando el otro metodo de reescalado, pero si no, este va de lujo.


Actualmente desarrollando nuestra web y UXCode : http://www.gcrew.es

Imagen de trom_us

aca

lo que creo explica DeViaNTe.

-- usando lo del 3d, la parte mala es que lo hace en tiempo real,
-- y obvio solo a screen, por ende es mucho mas rapido, pero inutil si lo quieres guardar por separado.
 
    --V_W = width de la imagen
    --V_H = heiht de la imagen
 
    en_X=0 -- done la quieres en tu pantalla
    en_Y=0   -- donde la quieres en tu pantalla
    f_a=(480/(V_W/100))/100 
-- 480 es al tamaño al que se quiere reducir o aumentar
--, 100 es el porcentaje se deja asi
    f_b=(272/(V_H/100))/100 
-- 272 es al tamaño al que se quiere reducir o aumentar
--, 100 es el porcentaje se deja asi 
 
   Frame_View = {    {0, 0, en_X, en_Y, 0},    {V_W, V_H, (V_W*f_a)+en_X, (V_H*f_b)+en_Y, 0}    }        
 
   Gu.start3d()
   Gu.texImage(foto)
   Gum.drawArray(Gu.SPRITES, Gu.TEXTURE_32BITF+Gu.VERTEX_32BITF+Gu.TRANSFORM_2D, Frame_View)
   Gu.end3d()

 

Imagen de trom_us

voy a agregar que...

primero en GuinXell, existe una funcion para ello: ejemplo de como se usa....

--programa de test 
 
imagen = Image.load("ms0:/c_/sistema/fondos/MANGA/Image87.png")
screen:blit(0,0,imagen)
screen.flip()
pausa()
 
screen:blit(0,0,img.stretch(imagen,240,160))
screen.flip()
pausa()
 
-- este programa nos muestra una imgen en su tamaño real,
-- y luego redimencionada a 240,160, es decir se chica o grande
-- dicha imagen sera de 240x160

 

pero... aca les dejo la funcion en concreto, para que podamos darnos cuenta de que tan cierto es que GuinXell optimiza las interacciones mas comunes...

 

-- redimenciona una imagen
 
function img.stretch(stretch_imagen,stretch_win,stretch_hin)
 local w=stretch_imagen:width()
 local h=stretch_imagen:height()
 local w_,h_,wrate,hrate
 if w>stretch_win then w_ = w else w_=stretch_win end
 if h>stretch_hin then h_ = h else h_=stretch_hin end	
 local img1=Image.createEmpty(w_,h_)  
 local img2=Image.createEmpty(stretch_win,stretch_hin) 
 wrate = w/stretch_win
 hrate = h/stretch_hin			
 for x=0,stretch_win-1 do	
  img1:blit(x,0,stretch_imagen,x*wrate,0,1,h_)	
 end 			
 for x=0,stretch_hin-1 do	
  img2:blit(0,x,img1,0,x*hrate,w_,1)	
 end		
 return img2
end
 
--*GuinXell Function by Trom_Us
-----------------------------------------------------

 

con esto entederemos que si comparamos hacerlo pixel por pixel, obtendriamos en numero... en una imagen de 100x100

, una cantidad de 100x100 del recorrido + (100x100)*2 del tiempo que se lleva en leer y escribir, + eso x 2 del tiempo que la psp se tarde en hacer dicho movimiento.

en cambio con img.stretch(), obtenemos si leemos bien, una cantidad de 100+100 del recorrido, + 100+100 del tiempo que lee y escribe, + 100+100 el tiempo que se tarde en hacer todo eso, multiplicado por dos

resultados en numero...  si calcule bien, es 60,000 vs 800, en numeros, si existe una gran diferencia. talvez me faltaron candidaes como el maximizado o minimizado de la imagen resultante, pero solo aumentaria los numeros, que reducido a tiempo, es mucho. espero les haya ayudado. saludos.

 

P.D. en otras palabras, cuando usen esa funcion BAN!!!, en caliente obtienen el resultado.

 

Imagen de pspgorrister

Duda sobre el código

Antes de nada decir que vaya forma de nombrar las variables, parece más Perl ofuscado que Lua, espero que no uses esa forma en los ejemplos de tus funciones. xDD

Luego hay una cosa que no entiendo, primero porque me pierdo con esas variables de nombre tan ofuscado, y luego porque veo que tienes 2 bucles que recorren el primero una fila, y el segundo una columan de la imagen. ¿Dónde se miran los demás píxeles?. Igual me pierdo con algo que hace la función blit, cuya sintaxis no conozco, de ahí mi pregunta. No veo optimización del resto de píxeles, tanto de mayor a menor como de menor a mayor.


LuaDiE: Crea en Lua sin teclear código. Compatible HM7, HMv2, LuaPlayer, LuaDEV y PGE.

Imagen de trom_us

el problema mas que nada...

es que no sabes de las funciones luaplayer, y si en base a lo basico uno programa pues quedan programas como usar pixel por pixel.

desconosco si en C para PSP haya algo parecido a las funcones que use aca. te explico.

 

"Antes de nada decir que vaya forma de nombrar las variables,
parece más Perl ofuscado que Lua, espero que no uses esa forma en los
ejemplos de tus funciones. xDD"
no son ejemplos,y cada quien tendra su manera, si no te gusta ya es cosa muy aparte deacuerdo.

"Luego hay una cosa que no entiendo" obvio

," primero porque me pierdo con esas
variables de nombre tan ofuscado"
ahi no te puedo ayudar,

"y luego porque veo que tienes 2
bucles que recorren el primero una fila, y el segundo una columan de la
imagen. ¿Dónde se miran los demás píxeles?.".
. no se leen pixeles, eso implicaria un WxH=(100x100=10000), segun las funciones que NO conoces, se lee por filas y columnas. esto es W+H(100+100=200)

"Igual me pierdo con algo que
hace la función blit, cuya sintaxis no conozco, de ahí mi pregunta."
, de ahi que no lo comprendas.

"No
veo optimización del resto de píxeles, tanto de mayor a menor como de
menor a mayor.",
la optimizacion es en el proceso, la imagen resultante no es mejor, sino el proceso que se realiza. eso es lo optimizado. ademas que añado que puedes reducirla o aumentarla.

espero haverme explicado. si tienes dudas de procesos eso si me puedes preguntar, que si es bonito para ti o feo para otros, eso no. al menos a mi no me viene al caso.

 

P.D. disculpa si te lo digo asi, pero es que tienes un tono para decir las cosas. hubiera sido mas facil, que me dijeras "oye, por mas que le busco no comprendo el modo en que opera dicho proceso, me lo podrias explicar" <--obviando que desconoces las funciones y sintaxis. al menos yo hoy nunca te voy a correjir en ese aspecto hablando C, ya no me acuerdo, por tanto no soy el indicado, pero en procesos?, si, talvez.

 

Imagen de pspgorrister

Si me estás diciendo que lees

Si me estás diciendo que lees lso píxeles por columnas y por filas, es tontería hacerlo por filas y luego por columnas. Me explico

Imagen (un caracter = pixel)

AB0C3F
378D95
87123D
ADDEH2

Haces un bucle que lea cada fila y la tratas

for fila = 0 hasta fila < filas_imagen
   Procesa la fila
 
Quedaría algo así:
Procesando... AB0C3F
Procesando... 378D95
Procesando... 87123D
Procesando... ADDEH2

¿Para qué volver a leer las columnas si ya has leído toda la imagen sólo con las filas?. Es lo que no entendía y me estaba confundiendo.

Ahora vamos a ponernos que tenemos la primera linea y la queremos poner un 150% más grande (x = pixel vacío)

AB0C3F ===> xxxxxxxxx

Dónde está el algorimo que hace eso. ¿El blit?, que yo sepa un blit no optimiza, tan sólo mueve pixeles de un lado a otro, si le falta espacio, recorta, y si se queda corto no los toca. Sea en Lua, en C, o en VisualBasic.

Esto haría un blit a una imagen más grande:

AB0C3F ===> AB0C3Fxxx

Y esto a una más pequeña

AB0C3F ===> AB0

Yo no sé si tú has probado ese algoritmo realmente, pero yo no veo que funcione por ningún lado. Recorta una imagen, nada que ver con redimensionar su aspecto proporcionalmente.

 

EDITO: En el caso que un blit optimizara una imagen, no haría falta ningún algoritmo, tan sólo blitear directamente a otra superficie de menor tamaño.


LuaDiE: Crea en Lua sin teclear código. Compatible HM7, HMv2, LuaPlayer, LuaDEV y PGE.

Imagen de trom_us

tendrias que probarlo

porque asi como me acabas de decir, no te entendi nada. entonces prueba si sabes como dicha funcion en lua.

no es un decir, es un echo, yo asi la utilizo.

y en efecto como el caso de pixel x pixel, o nos brincamos pixeles, o los repetimos. insisto que la funcion que yo les di da el mismo resultado que hacerlo pixel por pixel, pero "EL CODIGO" esta optimizado de forma que obtengamos el mismo resultado, pero en dos pasadas, W+H, y no en W*H.

no te puedo explicar mas, tienes que probarla si no no comprenderas de que hablo.

pero recuera la primera pasada alarga o acorta el W, pero toda la altura de un jalon. ya tenido eso. pasamos por la H y alargamos o acortamos dicha H, pero todo el ancho de un jalon, en vez de hacer lo mismo en cada pixel, si al final es el mismo resultado.

 

 

 

 

Imagen de Chimecho

mmm...

Si, hay una forma de hacerlo, pero es demasiado lenta...

verás, trata de simple matemática, comienza a ver que pixel tocaría si la escala cambia de tanto a tanto y luego comenzar a blitear píxeles en otra imagen, lo que lo hace extremadamente lento.

Creo que sería algo así:

function redimensionar(imagen,w2,h2)
    w1=imagen:width()
    h1=imagen:height()
    temp=Image.createEmpty(w2,h2)
 
    for j=0,w2-1 do
        for i=0,h2-1 do
               temp:pixel(i,j,imagen:pixel(math.floor(i*(w1/w2),math.floor(j*(h1/h2)))
        end
    end
 
    return temp
end

y la explicación:

w2 -- w1
 i  --  x
x = i*(w1/w2) <-- no hay pixeles decimales, por eso arriba math.floor()

h2 -- h1
 j   --  y
y = j*(h1/h2) <-- no hay pixeles decimales, por eso arriba math.floor()

Pura regla de 3 xD

Nota: Hay otra forma, que pongas la imagen como textura en un plano GU (2 triángulos) y luego redimensionas dicho plano... pero en luahm7 es un trámite manejar el GU xDD

Saludos!



PSP FAT [5.00 M33-6] [6.60 ME] [Hard Moded] / Nintendo Wii [4.1U] [cIOS Hermes] [D2X cIOS] / iPhone 3G [4.2.1] [BB 05.13.04] [redsn0w] / iPod Touch 4 [6.1] [evasi0n]

07/05/10: Tuve el placer de llamarle con todo derecho "N00B" a molotovi xDDD

Recuerda: Sé el intérprete -_-

Imagen de Chimecho

me equivoqué xD

Eso, en el código de arriba se me saltaron dos )

function redimensionar(imagen,w2,h2)
	w1=imagen:width()
	h1=imagen:height()
	temp=Image.createEmpty(w2,h2)
 
	for j=0,w2-1 do
		for i=0,h2-1 do
			temp:pixel(i,j,imagen:pixel(math.floor(i*(w1/w2)),math.floor(j*(h1/h2))))
		end
	end
 
	return temp
end

Ahi ya está corregido... xD



PSP FAT [5.00 M33-6] [6.60 ME] [Hard Moded] / Nintendo Wii [4.1U] [cIOS Hermes] [D2X cIOS] / iPhone 3G [4.2.1] [BB 05.13.04] [redsn0w] / iPod Touch 4 [6.1] [evasi0n]

07/05/10: Tuve el placer de llamarle con todo derecho "N00B" a molotovi xDDD

Recuerda: Sé el intérprete -_-

Imagen de pspgorrister

Están mal los paréntesis.

Están mal los paréntesis. xDDD

i*(w1/w2) != (i*w1)/w2

Un saludo. :D

Imagen de Chimecho

WTF??

osea, me quieres decir que no es lo mismo:

2*(3/2) que si digo (2*3)/2 ???? ah??????????

 

veamos:

2*(1.5) = 3

(6)/2 = 3

vale, va una....

 

i=6.2  <-- si, ya se que nunca pasará eso en mi código, pero vamos que estoy tratando de demostrar i*(w1/w2) == (i*w1)/w2

 

6.2*(5.3/1.2) = 6.2*(4.41666666....) = 27.383333....

(6.2*5.3)/1.2 = (32.86)/1.2 = 27.383333....

van dos, pero sinceramente no me pasaré toda la noche haciendo esto... xDDDDDD

Saludos! xDD



PSP FAT [5.00 M33-6] [6.60 ME] [Hard Moded] / Nintendo Wii [4.1U] [cIOS Hermes] [D2X cIOS] / iPhone 3G [4.2.1] [BB 05.13.04] [redsn0w] / iPod Touch 4 [6.1] [evasi0n]

07/05/10: Tuve el placer de llamarle con todo derecho "N00B" a molotovi xDDD

Recuerda: Sé el intérprete -_-

Imagen de pspgorrister

Ehhhhh???? pero qué hace

Ehhhhh???? pero qué haces loco. XDDD

En serio, hoy te pasa algo. :P

A ver fíjate bien, primero lo de los paréntesis:

2*(3/2) ==> 2*(1) = 2
(2*3)/2 ==> (6)/2 = 3

De verdad, que sé que eres un gran coder y lo que pasa es que ahora se te ha ido la almendra... jajaja.

Un saludo amigo. :D


LuaDiE: Crea en Lua sin teclear código. Compatible HM7, HMv2, LuaPlayer, LuaDEV y PGE.

Imagen de DeViaNTe

sorry de new

gorrister, creo k en lua no se autoconvierten en (int), sino que si es decimal, devuelve decimal, para ser mas exactos hm7 creo k usa double. Por lo tanto dividir y multiplicar por lo que sea, se realizará en el mismo orden, paréntesis o no.


Actualmente desarrollando nuestra web y UXCode : http://www.gcrew.es

Imagen de pspgorrister

Gracias Deviante, es eso. Al

Gracias Deviante, es eso. Al que se le ha "ido la almendra" es a mí. jajaja

Un saludo.

Imagen de DeViaNTe

nah!

estás acostumbrado a C, es normal que pasen estas cosas. ^^

Imagen de Chimecho

oh Dios Mio...

tio, estás conciente de lo que dices?

3/2 = 1???

osea que si multiplico 1 por 2 me dará 3???

Creo que la "discusión" con trom_us te tiene mal (si, los estoy siguiendo uno a uno sus comments xD)



PSP FAT [5.00 M33-6] [6.60 ME] [Hard Moded] / Nintendo Wii [4.1U] [cIOS Hermes] [D2X cIOS] / iPhone 3G [4.2.1] [BB 05.13.04] [redsn0w] / iPod Touch 4 [6.1] [evasi0n]

07/05/10: Tuve el placer de llamarle con todo derecho "N00B" a molotovi xDDD

Recuerda: Sé el intérprete -_-

Imagen de carlossg

No entendi...

No se si sere tonto o subnormal o algo pero si tu no lo sabes...Solo te queda revisar el tuto de pipagerardo

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.