Python Rückgabe eines

Tron36

Ensign
Registriert
Jan. 2011
Beiträge
212
Hallo Leute,

ich bin dabei bezüglich Stenografie ein Text in einer Bilddatei abzuspeichern. Bzw. eine Bilddatei zu "bearbeiten". Dabei Iteriere ich durch einen String. Dabei bekomme ich eine Fehlermeldung.

Der Code:
Code:
from PIL import Image
import os
import sys

arguments = sys.argv
# overwrite arguments to test the program without arguments
arguments = ["Text.txt", "Bild.bmp"]

# text.txt
INPUT_TEXT = arguments[0]
# bild.bmp
INPUT_IMAGE = arguments[1]
# bild.bmp.ste
OUTPUT = arguments[1] + ".ste.bmp"


def encode_image(img, msg):
    length = len(msg)
    encoded = img.copy()
    width, height = img.size
    index = 0
    for row in range(height):
        for col in range(width):
            r, g, b = img.getpixel((col, row))
            if row == 0 and col == 0 and index < length:
                asc = length
            elif index <= length:
                #c = msg[index -1]
                asc = ord(msg[index -1])
            else:
                asc = r
            encoded.putpixel((col, row), (asc, g , b))
            index += 1
    return encoded

def main():
    #original_image_file = "Bild.bmp"
    img = Image.open(INPUT_IMAGE)
    #verstecktext_Datei = open("Text.txt", "rb")
    verstecktext = INPUT_TEXT.read()
    
    img_encoded = encode_image(img, verstecktext)
    encoded_image_file = Image
    
    thisFile = encoded_image_file
    base = os.path.splitext(thisFile)[0]
    os.rename(thisFile, base + ".bmp.ste")
    img_encoded.save(thisFile)
    
if __name__ == "__main__":
    main()

Bekomme jedoch folgende Fehlermeldung:
Code:
Traceback (most recent call last):
  File "D:\Programme\eclipse\plugins\org.python.pydev_6.2.0.201711281614\pysrc\pydevd.py", line 1621, in <module>
    main()
  File "D:\Programme\eclipse\plugins\org.python.pydev_6.2.0.201711281614\pysrc\pydevd.py", line 1615, in main
    globals = debugger.run(setup['file'], None, None, is_module)
  File "D:\Programme\eclipse\plugins\org.python.pydev_6.2.0.201711281614\pysrc\pydevd.py", line 1022, in run
    pydev_imports.execfile(file, globals, locals)  # execute the script
  File "D:\Programme\eclipse\plugins\org.python.pydev_6.2.0.201711281614\pysrc\_pydev_imps\_pydev_execfile.py", line 25, in execfile
    exec(compile(contents+"\n", file, 'exec'), glob, loc)
  File "E:\Uni\Master-Medieninformatik\Übung2\ersteAufgabe\steganohide.py", line 32, in <module>
    img_encoded = encode_image(img, verstecktext)
  File "E:\Uni\Master-Medieninformatik\Übung2\ersteAufgabe\steganohide.py", line 17, in encode_image
    asc = ord(msg[index -1])
TypeError: ord() expected string of length 1, but int found

Ich hoffe ihr könnt mir helfen.

Lg
Tron36
 
Disclaimer: Ich habe 0 Ahnung von Python

Ich nehme an msg ist ein String? dann sollte msg[index -1] ein Character sein, ord() nimmt laut Doku aber nur Strings der Länge 1

Edit: Character sind üblicherweise nur ein Typ-Alias für Integer (deshalb "but int found")
 
Hooo schrieb:
Ich nehme an msg ist ein String? dann sollte msg[index -1] ein Character sein, ord() nimmt laut Doku aber nur Strings der Länge 1
Python kennt keinen char-Typ, weder als Alias noch sonst wie. Willst du nur ein Zeichen speichern, nimmst du ein String mit Länge 1. Das Problem hier ist, dass msg kein String ist, da die Datei im Binary Mode geöffnet wurde und damit werden eben Bytes zurückgegeben.
 
Zurück
Oben