I think I've made a mistake in the code. Here is the right version which I
tested in maya2012 x64 -
############# CODE BEGIN #################
import maya.OpenMaya as OpenMaya
import maya.OpenMayaRender as OpenMayaRender
import thread
import time
image = OpenMaya.MImage()
#image.readFromFile(r"d:\devroot\lena.jpg")
image.readFromFile(r"D:\devroot\Chrysanthemum.jpg")
def sendMImageToRenderView(mimage):
start = time.time()
## This function takes about 10.9s to finish a 1024x768 size image ##
wScriptUtil = OpenMaya.MScriptUtil()
widthPtr = wScriptUtil.asUintPtr()
hScriptUtil = OpenMaya.MScriptUtil()
heightPtr = hScriptUtil.asUintPtr()
wScriptUtil.setUint(widthPtr, 0)
hScriptUtil.setUint(heightPtr, 0)
mimage.getSize(widthPtr, heightPtr)
width = wScriptUtil.getUint(widthPtr)
height = hScriptUtil.getUint(heightPtr)
print width, height
size = width * height
charPixelPtr = mimage.pixels()
print time.time() - start
OpenMayaRender.MRenderView.startRender(width, height)
######### FIXME: too slow, right? {
def _updatePixels(x, y, rv_pixels):
if OpenMayaRender.MRenderView.doesRenderEditorExist():
OpenMayaRender.MRenderView.updatePixels(x, x, y, y, rv_pixels)
OpenMayaRender.MRenderView.refresh(x, x, y, y)
scriptUtil = OpenMaya.MScriptUtil()
rv_pixels = OpenMayaRender.RV_PIXEL()
for i in range(0, size):
redIndex = (i*4) + 0
greenIndex = (i*4) + 1
blueIndex = (i*4) + 2
alphaIndex = (i*4) + 3
#red, green, blue, alpha = 255, 0, 0, 0
## Takes about 1.5s in all FOR loops ##
red = scriptUtil.getUcharArrayItem(charPixelPtr, redIndex)
green = scriptUtil.getUcharArrayItem(charPixelPtr, greenIndex)
blue = scriptUtil.getUcharArrayItem(charPixelPtr, blueIndex)
alpha = scriptUtil.getUcharArrayItem(charPixelPtr, alphaIndex)
y = int(i/width)
x = int(i-y*width)
## Takes about 7s in all FOR loops ##
rv_pixels.a = alpha
rv_pixels.r = red
rv_pixels.g = green
rv_pixels.b = blue
## Takes about 2s in all FOR loops ##
#hread.start_new(_updatePixels, (x, y, rv_pixels))
_updatePixels(x, y, rv_pixels)
#OpenMayaRender.MRenderView.refresh(0, width-1, 0, height-1)
OpenMayaRender.MRenderView.endRender()
######### END FIXME: }
print time.time() - start
sendMImageToRenderView(image)
############# CODE END #################
Thanks,
Will
2011/9/1 Will Zhou <[email protected]>
> Hello,
>
> This script loads an image file and sends it to Maya RenderView. It can
> work, but just too slow when the resolution is larger than 1024x768. Does
> anyone know how to speed it up please? Not one pixel by one pixel, but
> region by region. Is there any example like using
> OpenMayaRender.RV_PIXEL(32) ? I know it's wrong, but how to create a
> RV_PIXEL array? Thank you very much.
>
> ############# CODE BEGIN #################
> ## Author: Will Zhou <[email protected]>
> ## Date: 09/01 2011
>
> import maya.OpenMaya as OpenMaya
> import maya.OpenMayaRender as OpenMayaRender
>
>
> image = OpenMaya.MImage()
> #image.readFromFile(r"d:\devroot\lena.jpg")
> image.readFromFile(r"D:\devroot\Chrysanthemum.jpg")
> wScriptUtil = OpenMaya.MScriptUtil()
> widthPtr = wScriptUtil.asUintPtr()
> hScriptUtil = OpenMaya.MScriptUtil()
> heightPtr = hScriptUtil.asUintPtr()
> scriptUtil.setUint(widthPtr, 1)
> scriptUtil.setUint(heightPtr, 1)
> image.getSize(widthPtr, heightPtr)
> width = scriptUtil.getUint(widthPtr)
> height = scriptUtil.getUint(heightPtr)
> print width, height
>
> size = width * height
>
> charPixelPtr = image.pixels()
>
> OpenMayaRender.MRenderView.startRender(width, height)
>
> for i in range(0, size):
> redIndex = (i*4) + 0
> greenIndex = (i*4) + 1
> blueIndex = (i*4) + 2
> alphaIndex = (i*4) + 3
> red = scriptUtil.getUcharArrayItem(charPixelPtr, redIndex)
> green = scriptUtil.getUcharArrayItem(charPixelPtr, greenIndex)
> blue = scriptUtil.getUcharArrayItem(charPixelPtr, blueIndex)
> alpha = scriptUtil.getUcharArrayItem(charPixelPtr, alphaIndex)
>
> # FIXME: {
> y = int(i/width)
> x = int(i-y*width)
>
> rv_pixels = OpenMayaRender.RV_PIXEL()
> rv_pixels.a = alpha
> rv_pixels.r = red
> rv_pixels.g = green
> rv_pixels.b = blue
>
> if OpenMayaRender.MRenderView.doesRenderEditorExist():
> OpenMayaRender.MRenderView.updatePixels(x, x, y, y, rv_pixels)
> # END FIXME: }
>
> OpenMayaRender.MRenderView.refresh(x, x, y, y)
> #OpenMayaRender.MRenderView.refresh(0, width-1, 0, height-1)
> OpenMayaRender.MRenderView.endRender()
>
> ############# CODE END #################
>
> Regards,
> Will
>
>
--
view archives: http://groups.google.com/group/python_inside_maya
change your subscription settings:
http://groups.google.com/group/python_inside_maya/subscribe