복붙노트

[PYTHON] numpy 배열을 PySide QPixmap으로 변환

PYTHON

numpy 배열을 PySide QPixmap으로 변환

이미지를 NumPy 배열로 PySide QPixmap으로 변환하여 표시 할 수 있도록했습니다 (편집 : 내 PySide UI에서). 이미 qimage2ndarray 도구가 있지만 PyQt4에서만 작동합니다. PySide로 작업하기 위해 변경하려고 시도했지만 도구의 C 부분을 변경해야하고 C에 대한 경험이 없습니다. 어떻게해야합니까? 아니면 어떤 대안이 있습니까?

해결법

  1. ==============================

    1.한 가지 대안은 PIL 라이브러리를 사용하는 것입니다.

    한 가지 대안은 PIL 라이브러리를 사용하는 것입니다.

    >>> import numpy as np
    >>> import Image
    >>> im = Image.fromarray(np.random.randint(0,256,size=(100,100,3)).astype(np.uint8))
    >>> im.show()
    

    http://www.pyside.org/docs/pyside/PySide/QtGui/QImage.html에서 QPixmap 생성자를 볼 수 있습니다.

    생성자에서 numpy 배열을 직접 사용할 수 있어야합니다.

    형식 인수는 다음 중 하나입니다. http://www.pyside.org/docs/pyside/PySide/QtGui/QImage.html#PySide.QtGui.PySide.QtGui.QImage.Format.

    예를 들어, 다음과 같이 할 수 있습니다.

    >>> a = np.random.randint(0,256,size=(100,100,3)).astype(np.uint32)
    >>> b = (255 << 24 | a[:,:,0] << 16 | a[:,:,1] << 8 | a[:,:,2]).flatten() # pack RGB values
    >>> im = PySide.QtGui.QImage(b, 100, 100, PySide.QtGui.QImage.Format_RGB32)
    

    나는 PySide를 설치하지 않았으므로 이것을 테스트하지 않았다. 기회는 그대로있는 것은 아니지만 올바른 방향으로 인도 할 수 있습니다.

  2. ==============================

    2.예를 들어 numpy를 사용하여 직접 데이터를 만드는 경우 가장 빠른 방법은 QImage에 직접 액세스하는 것입니다. 버퍼 객체 인 QImage.bits ()에서 ndarray를 생성하고, numpy 메소드를 사용하여 작업하고, 완료되면 QImage에서 QPixmap을 생성 할 수 있습니다. 기존 QImage를 읽거나 수정할 수도 있습니다.

    예를 들어 numpy를 사용하여 직접 데이터를 만드는 경우 가장 빠른 방법은 QImage에 직접 액세스하는 것입니다. 버퍼 객체 인 QImage.bits ()에서 ndarray를 생성하고, numpy 메소드를 사용하여 작업하고, 완료되면 QImage에서 QPixmap을 생성 할 수 있습니다. 기존 QImage를 읽거나 수정할 수도 있습니다.

    import numpy as np
    from PySide.QtGui import QImage
    
    img = QImage(30, 30, QImage.Format_RGB32)
    imgarr = np.ndarray(shape=(30,30), dtype=np.uint32, buffer=img.bits())
    
    # qt write, numpy read
    img.setPixel(0, 0, 5)
    print "%x" % imgarr[0,0]
    
    # numpy write, qt read
    imgarr[0,1] = 0xff000006
    print "%x" % img.pixel(1,0)
    

    배열이 이미지 객체보다 오래 남아 있지 않은지 확인하십시오. 원한다면 alpha, red, green 및 blue 비트에 대한 개별 액세스를위한 레코드 배열과 같은 더 정교한 dtype을 사용할 수 있습니다 (endianess에주의하십시오).

    numpy를 사용하여 픽셀 값을 계산하는 효율적인 방법이없는 경우 scipy.weave를 사용하여 img.bits ()가 가리키는 배열에서 작동하는 일부 C / C ++ 코드를 인라인 할 수 있습니다.

    이미 ARGB 형식의 이미지가있는 경우 데이터에서 QImage를 생성하는 것이 좋습니다.

  3. ==============================

    3.PIL을 사용하는 것에 대한 @ user545424 답에 덧붙여, PIL에 의존하고 싶지 않다면 수동으로 np 배열에서 직접 이미지를 만들 수 있습니다 :

    PIL을 사용하는 것에 대한 @ user545424 답에 덧붙여, PIL에 의존하고 싶지 않다면 수동으로 np 배열에서 직접 이미지를 만들 수 있습니다 :

    width = 100
    height = 100
    data = np.random.randint(0,256,size=(width,height,3)).astype(np.uint8)
    
    img = QtGui.QImage(width, height, QtGui.QImage.Format_RGB32)
    for x in xrange(width):
        for y in xrange(height):
            img.setPixel(x, y, QtGui.QColor(*data[x][y]).rgb())
    
    pix = QtGui.QPixmap.fromImage(img)
    

    필자는 PIL을 사용하여 실제 이미지 데이터를 QImage로 읽을 수있는 방법이 있지만, @ user545424가 그의 대답부터 그 부분을 처리하도록 할 것입니다. PIL은 Image -> QPixmap을 직접 변환하는 데 편리한 ImageQt 모듈과 함께 제공됩니다.하지만 불행히도 PyQt4 QPixmap은 도움이되지 않습니다.

  4. from https://stackoverflow.com/questions/9794019/convert-numpy-array-to-pyside-qpixmap by cc-by-sa and MIT license