Python - 、utf-8、コーデックは位置 0 のバイト 0xff をデコードできません: 無効な開始バイト / 予期しないデータの終わり

okwaves2024-01-25  190

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

総合生活情報サイト - OKWAVES
総合生活情報サイト - OKWAVES
生活総合情報サイトokwaves(オールアバウト)。その道のプロ(専門家)が、日常生活をより豊かに快適にするノウハウから業界の最新動向、読み物コラムまで、多彩なコンテンツを発信。