Nuevo experimento: el operador del XSI getpixelarray, funciona correctamente para leer una imagen de 4 píxeles de ancho y 2 de alto, cuando le doy estos datos (pide un array para saber las posiciones de los píxeles que debe mirar):
Array1: [0, 0, 1, 0, 2, 0, 3, 0, 0, 1, 1, 1, 2, 1, 3, 1].
Si la imagen es de 4 píxeles de ancho x uno de alto, funciona también con este array:
Arr=[0,1,2,3],[0,0,0,0].
He intentado que en la imagen de 4x2 lea el array [0,1,2,3][0,0,0,0][1,1,1,1], pero (obviamente) no funciona.
edito: fallo mío, lo correcto es darle [0,1,2,3,0,1,2,3],[0,0,0,0,1,1,1,1], así sí que funciona (lógicamente, 1 del a con 1 del b, 2 del a con 2 del b). No sé si será más sencillo de conseguir este array, o directamente el desglosado, seguramente éste, porque el valor a ya lo tienes con a*alto, sólo habría que hacer el loop para sacar el b, mañana miro.
.
Así que le doy el array como lo quiere y vía. El pero que le encuentro a esta manera, es que tengo que dar un rodeo, explico la parte interesante:
Primero consigo los dos arrays, el del ancho y el del alto.
w=[].
For I in range (ancho):
W.append(i).
resultado para un ancho=4: [0,1,2,3].
H=[].
For I in range (alto):
H, append(i).
.
Resultado para un alto=2: [0,1].
Ahora creo un array temporal así:
temp = [(x, y) for y in h for x in w].
Valor de temp= [(0,0), (1,0), (2,0), (3,0), (0,1), (1,1), (2,1), (3,1)].
Lo ideal sería que me dejara hacer eso sin tener que poner los paréntesis en (x, y), como no me deja (o no doy con la manera correcta), transformo ese resultado en el array que necesita el comando getpixelarray:
arr=[].
For I in temp:
Arr, extend(i).
Valor de arr = [0,0,1,0,2,0,3,0,0,1,1,1,2,1,3,1].
El resto no tiene nada de chicha, pongo el script completo por si alguien quiere investigarlo, y por si veis alguna manera más lógica de hacerlo, sobre todo a la hora de conseguir el array necesario sin dar tantos rodeos.
Código:
XSI = application.
Orot = application. Activescenerot.
Ocube = orot. Findchild (grid).
Omat = ocube. Material.
Oclips = omat. Imageclips.
Oclip = oclips(0).
Osource = oclip. Source.
Ancho = osource. Parameters(xres). Value.
Alto = osource. Parameters(yres). Value.
Resolución = ancho * alto.
Xsi, logmessage ((%s%s)%(nombre de la imagen:, oclip, name)).
Xsi, logmessage ((%s%s)%(ancho de la imagen:, ancho)).
Xsi, logmessage ((%s%s)%(alto de la imagen:, alto)).
Xsi, logmessage ((%s%s)%(resolución de la imagen:, resolución)).
Xsi. Logmessage (-.
W=[].
For I in range (ancho):
W.append(i).
H=[].
For I in range (alto):
H, append(i).
Temp = [(x, y) for y in h for x in w].
Arr=[].
For I in temp:
Arr, extend(i).
Oim = oclip. Getimage (). Getpixelarray(arr).
For I in range (0,resolución):
XSI. Logmessage ((%s%s)%(datos del pixel:, i)) txsi. Logmessage (colorr = +str(oim[0][i])) txsi. Logmessage (colorg = +str(oim[1][i])) txsi. Logmessage (colorb = +str(oim[2][i])) txsi. Logmessage (colora = +str(oim[3][i])) txsi. Logmessage (-.
Resultado del script sobre una imagen de 4 de ancho x 2 de alto (ojo. No probéis el script con imágenes grandes, por razones obvias).
Código:
# info : nombre de la imagen: small_tif.
# info : ancho de la imagen: 4.
# info : alto de la imagen: 2.
# info : resolución de la imagen: 8.
# info : -.
# info : datos del pixel: 0.
# info : colorr = 1.0.
# info : colorg = 1.0.
# info : colorb = 0.0.
# info : colora = 1.0.
# info : -.
# info : datos del pixel: 1.
# info : colorr = 0.0.
# info : colorg = 1.0.
# info : colorb = 1.0.
# info : colora = 1.0.
# info : -.
# info : datos del pixel: 2.
# info : colorr = 1.0.
# info : colorg = 0.0.
# info : colorb = 1.0.
# info : colora = 1.0.
# info : -.
# info : datos del pixel: 3.
# info : colorr = 1.0.
# info : colorg = 1.0.
# info : colorb = 1.0.
# info : colora = 1.0.
# info : -.
# info : datos del pixel: 4.
# info : colorr = 0.0.
# info : colorg = 0.0.
# info : colorb = 0.0.
# info : colora = 1.0.
# info : -.
# info : datos del pixel: 5.
# info : colorr = 1.0.
# info : colorg = 0.0.
# info : colorb = 0.0.
# info : colora = 1.0.
# info : -.
# info : datos del pixel: 6.
# info : colorr = 0.0.
# info : colorg = 1.0.
# info : colorb = 0.0.
# info : colora = 1.0.
# info : -.
# info : datos del pixel: 7.
# info : colorr = 0.0.
# info : colorg = 0.0.
# info : colorb = 1.0.
# info : colora = 1.0.
# info : -
Posdata: con esto mi batalla contra el pinpanel sin utilizar el operador push (ni Houdini) esta prácticamente ganada, viva yo.
Posdata: 2. Hacerlo con getpixel en lugar de getpixelarray (= hacerlo de uno en uno), es mucho más sencillo, se hace un loop y listo, pero supongo que, a la hora de calcular una imagen grande, siempre que se puedan recoger todos esos datos accediendo una sola vez a la imagen, será mucho más rápido que acceder a la imagen miles de veces, si tengo tiempo traduzco el script utilizando getpixel y mido los tiempos para comparar.