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

Reply via email to