1

私は Pygame を使用して Python でプログラムを作成しています。このプログラムは、画像を画面にロードし、生データを開き (jpg をテキスト ファイルとして開いた場合に表示される文字のように)、いくつかのランダムな文字をデータを jpg として再保存して、再び pygame にロードします。これにより、クールな見た目のグリッチ効果が得られます。

目的のグリッチに問題はありませんが、どのようなランダムなキャラクターがどこに配置されていても、特定の画像については、画像がグリッチ関数を通過するたびに、最終的に下部に灰色のバーが表示されることがわかりました画像。関数を単純化して、イメージをロードし、イメージを読み取りバイナリとして開き (Mac を使用している場合でも)、生データの文字列を保存し、この文字列に基づいて新しいファイルを書き込んでから、そのファイルをロードします。画像は意図的にグリッチされておらず、データはおそらく変更されていませんが、それでもこの灰色のバーが表示されます.

関連するコードは次のとおりです。

def initializeScreen(x, y):
    pygame.display.set_mode((x,y))
    return pygame.display.get_surface()

def importImage(fileName):
    imgText = open(fileName, 'rb')
    imgTextStr = imgText.read()
    imgText.close()
    return imgTextStr

screenSurf = initializeScreen(800,600)
textOfImg = importImage('/Users/Amoeba/Desktop/GlitchDriving/Clouds.jpg')
newFile = open('/Users/Amoeba/Desktop/GlitchDriving/tempGlitchFile.jpg', 'wb')
newFile.write(textOfImg)
newimgSurf = pygame.image.load('/Users/Amoeba/Desktop/GlitchDriving/tempGlitchFile.jpg')
screenSurf.blit(newimgSurf, (0,0))
pygame.display.flip()

関数を通過する前後の画像の例を次に示します。

ここに画像の説明を入力

灰色のバーのサイズは画像によって異なることに注意してください。一部の画像は、本来あるべきように、目に見えて変更されずに私の機能を通過することさえあります。また、自分のプログラムで書き込んだ新しいバージョンの jpg をプレビューなどの画像閲覧ソフトで開くと、灰色のバーが表示されません。私の疑いは、それが pygame 画像読み込み関数の癖であるか、jpg から文字列へ、またはその逆の変換でドロップされている奇妙な文字 (または空白) があることです。2 つのテキスト ファイル (灰色のバーがあるものとないもの) を比較しましたが、オンラインの「差分ファインダー」を使用しても違いは見つかりませんでした。

これは私の最初の投稿ですが、何十回も回答を求めてきました。どんな助けでも大歓迎です。

4

1 に答える 1

0

で作成したファイル オブジェクトを閉じることはないopenため、おそらくすべてのデータが新しいファイルに書き戻される (フラッシュされる) わけではありません。

ファイルを再度読み込もうとする前にファイルオブジェクトを閉じるか、ファイルを扱うときはいつでもwithステートメント(ファイルを閉じます)の使用を開始することをお勧めします。

def importImage(fileName):
    with open(fileName, 'rb') as imgText:
        return imgText.read()

screenSurf = initializeScreen(800,600)
textOfImg = importImage(r'path/to/file')

with open(r'path/to/otherfile', 'wb') as newFile:
    newFile.write(textOfImg)

newimgSurf = pygame.image.load(r'path/to/otherfile')
screenSurf.blit(newimgSurf, (0,0))
pygame.display.flip()
于 2013-09-02T08:17:56.560 に答える