[PYTHON] numpy 배열을 PySide QPixmap으로 변환
PYTHONnumpy 배열을 PySide QPixmap으로 변환
이미지를 NumPy 배열로 PySide QPixmap으로 변환하여 표시 할 수 있도록했습니다 (편집 : 내 PySide UI에서). 이미 qimage2ndarray 도구가 있지만 PyQt4에서만 작동합니다. PySide로 작업하기 위해 변경하려고 시도했지만 도구의 C 부분을 변경해야하고 C에 대한 경험이 없습니다. 어떻게해야합니까? 아니면 어떤 대안이 있습니까?
해결법
-
==============================
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.예를 들어 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.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은 도움이되지 않습니다.
from https://stackoverflow.com/questions/9794019/convert-numpy-array-to-pyside-qpixmap by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] 장고 양식 다중 선택 (0) | 2018.11.01 |
---|---|
[PYTHON] SQLAlchemy : 'and` 및`or`를 사용하면 예기치 않은 결과가 발생합니다. (0) | 2018.11.01 |
[PYTHON] scapy에서 변경된 src / dst로 pcap에서 패킷 보내기 (0) | 2018.11.01 |
[PYTHON] SQLAlchemy를 Google Cloud SQL과 함께 사용할 수 있습니까? (0) | 2018.11.01 |
[PYTHON] 두 문자열이 파이썬에서 서로의 순열인지 확인하기 (0) | 2018.11.01 |