Qt ライブラリ (Python の Pyside2) を使用して、C++ から Python にいくつかの関数を渡そうとしています。現時点では、コードを一方の側からもう一方の側に渡して Python に適応させることですべてが正しく機能しますが、画像の処理を開始するとエラーが発生します。
私が達成できる唯一のことは、画像の影を正しく解析することですが、画像の内側の部分 (残りの色に対応する部分) は空洞になっています。
これを入手する必要があります
しかし、代わりにこれを受け取ります
これらのバイトを処理するたびに、プログラムは次のエラーでクラッシュします。
'utf-8' codec can't decode byte 0x87 in position 0: invalid start byte
'utf-8' codec can't decode byte 0xba in position 0: invalid start byte
'utf-8' codec can't decode byte 0xcb in position 0: unexpected end of data
プログラムをデバッグすると、色に対応するバイトのみがプログラムをクラッシュさせ、ピクセルの RGBA を知ることができなくなることがわかりました。の元の C++ プログラムではどのピクセルでもこの問題が発生したことがないため、問題は Python で GB と AR を取得する方法にあるはずです。
私はバイトとバイト配列を扱うかなりの初心者です。 GB と AR を取得するという私が間違ったことをしていると思いますか、それともどう思いますか?
皆さん、ありがとうございました!
これは C++ の元の関数です。
QImage ImageConverter::convertGBAR4444(QByteArray &array, int width, int height, int startByte)
/// GBAR = ARGB (endianness)
{
qDebug() << "Opened GBAR4444 image.";
QImage img(width, height, QImage::Format_ARGB32);
img.fill(Qt::transparent);
for (int y = 0; y < height; ++y) {
for (int x = 0; x < width; ++x) {
uchar gb = array.at(startByte + y * 2 * width + x * 2);
uchar ar = array.at(startByte + y * 2 * width + x * 2 + 1);
uchar g = gb >> 4;
uchar b = gb & 0xF;
uchar a = ar >> 4;
uchar r = ar & 0xF;
img.setPixel(x, y, qRgba(r * 0x11, g * 0x11, b * 0x11, a * 0x11));
}
}
return img;
}
これがプロジェクトの Python バージョンのコードです。
from PySide2 import QtGui
from PySide2.QtGui import QImage, qRgba, qRgb
def convertGBAR4444(array, width, height, startByte = 0):
y = 0
img = QImage(width, height, QImage.Format_ARGB32)
img.fill(QtGui.QColor(0,0,0,0))
while (y < height):
x = 0
while (x < width):
gb = ord(array.at(startByte + y * 2 * width + x * 2))
ar = ord(array.at(startByte + y * 2 * width + x * 2 + 1))
g = gb >> 4
b = gb & 0xF
a = ar >> 4
r = ar & 0xF
img.setPixel(x, y, qRgba(r * 0x11, g * 0x11, b * 0x11, a * 0x11))
x += 1
y += 1
return img
自分で試してみたい場合は、次のデータが必要です。
convertGBAR4444(data, 32, 32, 13)
data = b'\x01 \x00 \x00\x10\x00\x10\x00\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0
0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11U"\x873\xbaD\xcbD\xcbD\xcb3\xa8"\x87\x00B\x00\x10\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\
x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"\x87f\xff\xca\xff\xdb\xff\xca\xff\xeb\xff\xeb\xff\xdb\xff\xca\xff\x
b9\xffU\xffD\xdb\x00B\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11D\xdcU\xff\xa9\xff\xfc
\xff\xfc\xff\xfc\xff\xfc\xff\xfc\xff\xfc\xff\xfc\xff\xec\xffv\xffU\xffU\xfe"\x86\x00 \x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x
00\x00\x00\x00\x003\xbaU\xffU\xffU\xff\xb9\xff\xfc\xff\xb9\xff\x98\xffe\xffU\xffU\xffU\xffU\xffU\xffU\xffD\xfe\x11\x95\x000\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"fU\xff\xba\xff\xfc\xff\x98\xffU\xffU\xffU\xffD\xfeD\xfdD\xfdD\xfdU\xffU\xffU\xffU\xffD\xfe3\xfc\x00r\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00D\xdc\xa9\xff\xfc\xff\xfc\xff\xa8\xffU\xffD\xfe3\xfd3\xfc3\xfc3\xfc3\xfc3\xfcD\xfdU\xffU\xffU\xffD\xfd"\xc7\x00@\x00\x10\x00\x00\x00
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"U\xff\xec\xff\xfc\xff\xfc\xffv\xffD\xfe3\xfc3\xfb"\xd7"\xd83\xfb3\xfc3\xfc3\xfcU\xffU\xffU\xffD\xfe3\xea\x00`\x00
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"vU\xff\xa9\xff\xfc\xff\xa9\xffU\xffD\xfd3\xea\x00\x90\x00\x80\x00p\x00p3\xfb3\xfc3\xfcU\xffU\xffU\xffD\xfe
3\xea\x00p\x000\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11TU\xfeU\xffU\xffU\xffD\xfeU\xff"\xc6\x00p\x00P\x000\x00@3\xec3\xfc3\xfcU\xffU\xffU\xffD\
xfe3\xfb\x00\x81\x000\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00RD\xfeU\xffU\xffU\xff3\xd9\x00\x81\x00P\x00 \x00 3\xbaD\xfd3\xfcD\xfeU\xff
U\xffU\xffD\xfd"\xd8\x00p\x000\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00@\x00`\x00p\x00p\x00`\x00P\x000\x00!D\xdcD\xfe3\xfcD\xfeU\xf
fU\xffU\xffD\xfe3\xfb\x00\xa1\x00`\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00 \x000\x000\x000\x00 \x11CU\xfeU\xffD\xf
eU\xffU\xffU\xffU\xffD\xfe3\xfb\x11\xc5\x00p\x00@\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x10\x
00\x10\x11CU\xfeU\xffU\xffU\xffU\xffU\xffU\xffD\xfd3\xfc\x11\xb3\x00p\x00P\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
\x00\x00\x00\x00\x00\x00\x00\x00\x11D\xedU\xffU\xffU\xffU\xffU\xffU\xff3\xfc3\xfb\x11\xb3\x00p\x00P\x00 \x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0
0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"fU\xffU\xffU\xffU\xffU\xffU\xffD\xfe3\xfb\x00\xb2\x00p\x00P\x00 \x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00D\xccU\xffU\xffU\xffU\xffU\xffU\xff3\xfa"\xe9\x00\x80\x00P\x00 \x00\x10\x00\x00\x00\x00\x00\x00\
x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00D\xeeU\xffU\xffU\xffU\xffU\xffD\xfd3\xfb\x11\xc5\x00`\x000\x
00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x003\xcaD\xfc3\xfc3\xfc3
\xfc3\xfc3\xfb"\xe8\x00\x81\x00P\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x
00\x00\x00\x00\x00\x000\x00a\x00\x81\x00\x91\x00\x91\x00\x91\x00\x91\x00\x81\x00P\x000\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11C"\x863\xca3\xda"\xc8\x11\x93\x00r\x00P\x000\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10U\xff\xa9\xff\xa8\xffU\xffU\xffD\xfdD\xfd\x00@\x00 \x00\x10\x00\x00
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x003\xcb\x98\xff\xfc\xff\xeb\x
ffU\xffU\xffD\xfe3\xfc\x11\xa5\x000\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
\x00\x00\x00\x00\x00\x00U\xffe\xff\xb9\xffv\xffU\xffU\xffD\xfe3\xfc3\xea\x00P\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10U\xffU\xffU\xffU\xffU\xffU\xff3\xfc3\xfc3\xfb\x00`\x000\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x103\xba3\xfc3\xfc3\xfc3\xfc3\xfc3\xfc3\xfc"\xd7\x00`\x000\x00\x00\x00\x00\x00\x00\x00\x00\
x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0003\xfc3\xfc3\xfc3\xfc3\xfc3\xfc3\xfc\x00\x90\x00
P\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x000
3\xda3\xfc3\xfc3\xfc3\xea\x00\x90\x00`\x000\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x000\x00P\x00p\x00p\x00p\x00`\x00@\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00 \x000\x000\x000\x00 \x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x
00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x10\x00\
x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
ord はバイトを文字に変換しようとします - それは r ですか本当に何がしたいのですか?代わりにバイトを整数に解凍したい場合は、striket パッケージを参照してください。
– フォバーシュタイナー2020 年 9 月 3 日 12:01
あなたの Python コードは奇妙です。byte に at メソッドがないのに、なぜ array.at を書くことができるのでしょうか?配列の実際の型は何ですか?また、try ステートメントには catch ブロックがありません。
– コンラッド・ルドルフ2020 年 9 月 3 日 12:02
@KonradRudolph 申し訳ありませんが、例の try ステートメントを削除するのを忘れていました。 .at() ステートメントを使用できる Qbytearray を使用しています
– ミゲロ2020 年 9 月 3 日 12:12
@MrFuppes また、C++ コードのように、struct を使用して gb と ar を uchar に変換しようとしました: <code>gb = struct.unpack("B", array.at(startByte + y * 2 * width + x * 2).encode())[0] ar = struct.unpack("B", array.at(startByte + y * 2 * width + x * 2 + 1).encode())[0]</code>
– ミゲロ2020 年 9 月 3 日 12:14
@MrFuppes いいえ、アンパックはこのコードが要求しているものではありません。バイト配列は単に連続した整数を保持しているだけです。 ordも必要ありません。バイト配列にサブセットするだけで整数が返されます。
– コンラッド・ルドルフ2020 年 9 月 3 日 12:16
投稿したコードはいくつかのエラーがあるため機能しませんが、表示されているエラー メッセージの原因となるものはありません。
これらのエラーが修正されたコードは次のとおりです。これは機能するはずです (ただし、提供したデータは切り捨てられるため機能しません)。
def convertGBAR4444(array, width, height, startByte = 0):
img = QImage(width, height, QImage.Format_ARGB32)
img.fill(QtGui.QColor(0,0,0,0))
for y in range(height):
for x in range(width):
gb = array[startByte + y * 2 * width + x * 2]
ar = array[startByte + y * 2 * width + x * 2 + 1]
#print(gb, ar)
g = gb >> 4
b = gb & 0xF
a = ar >> 4
r = ar & 0xF
img.setPixel(x, y, qRgba(r * 0x11, g * 0x11, b * 0x11, a * 0x11))
return img
2
現在このエラーが発生しています g = gb >> 4 TypeError: >> でサポートされていないオペランド タイプ: 'bytes'そして「int」?
– Mイゲロ2020 年 9 月 3 日 12:19
結果を生み出す' ord() 'うまくいき、イメージを完璧に作りました。ありがとうございます!!!
– ミゲロ2020 年 9 月 3 日 12:27