Bildpfad öffnen, Bild resizen Wordpress API Pfad Argument

Fragen zu Tkinter.
Antworten
Zoja
User
Beiträge: 145
Registriert: Freitag 28. Februar 2014, 14:04

Hallo Leute!

Ich will ein Bild aussuchen, das geschieht via askopenfilename. Ich kriege dann den Bildpfad, dieser wird in der Wordpress api als Pfad gebraucht. Ich öffne nun dieses Bild mit Image.open(Pfad) -> jetzt ist das Bild ja offen, also kein Pfad mehr.

Wenn ich jetzt das Bild resize habe ich ja kein Pfad mehr, sondern das Bildobjekt für die Wordpress API brauche ich aber einen Pfad.

Meine Lösung wäre es das Bildobjekt einfach zu speichern und dann den neuen Pfad auszusuchen, nur fühlt sich das nicht richtig an, irgendwie keine elegante Lösung oder?

Geht das nicht einfacher?

Code: Alles auswählen

    def bildinhalt_aussuchen():
        """ Hier wird nach dem Bild gefragt """
        pfad = askopenfilename()
        der_pfad = pfad
        im = Image.open(der_pfad)
        im.size = list(im.size)
        im.size[0] = im.size[0] / 10
        im.size[1] = im.size[1] / 10
        im.size = tuple(im.size)
#        print im.size
        bildname = bildname_area.get("1.0", END)
        bildtyp = bildtyp_area.get("1.0", END)
        global das_bild
        das_bild = wordpress_bild(pfad, bildname, bildtyp)
        """ Erstellt ein Label, in dem man sieht wo das Bild liegt """
        der_bild_pfad = Label(wp_sp_root, text=der_pfad)
        der_bild_pfad.place(x = 80, y = 10)
habe jetzt den save drin, der pfad wird überschrieben (soll aber ein neues Bild sein, einfach bildname + "1" oder so, aber das kriege ich hin) Die Bilder werden aber schwarz!

Code: Alles auswählen

im.save(pfad)
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@Zoja: was ist die Wordpress-API, welches Modul benutzt Du? Was macht wordpress_bild?
Warum bindest Du den Pfad erst an pfad und dann an der_pfad? Auf Attributen zu arbeiten, wie Du es hier mit im.size machst, ist gar nicht gut, denn bei jeder Zuweisung könnte das Bild skaliert werden. Woher kommen bildname_area und bildtyp_area? Vergiss schnell, dass es sowas wie global gibt. Argumente betreten eine Funktion als Parameter und verlassen sie als Rückgabewerte. Ein Label in so einer Funktion zu erzeugen ist keine gute Idee. Was passiert, wenn die Funktion mehrfach aufgerufen wird?
Zoja
User
Beiträge: 145
Registriert: Freitag 28. Februar 2014, 14:04

Sirius3 hat geschrieben:@Zoja: was ist die Wordpress-API, welches Modul benutzt Du? Was macht wordpress_bild?
Warum bindest Du den Pfad erst an pfad und dann an der_pfad? Auf Attributen zu arbeiten, wie Du es hier mit im.size machst, ist gar nicht gut, denn bei jeder Zuweisung könnte das Bild skaliert werden. Woher kommen bildname_area und bildtyp_area? Vergiss schnell, dass es sowas wie global gibt. Argumente betreten eine Funktion als Parameter und verlassen sie als Rückgabewerte. Ein Label in so einer Funktion zu erzeugen ist keine gute Idee. Was passiert, wenn die Funktion mehrfach aufgerufen wird?
Hier ist das wordpress_bild, das ist von der API, es braucht halt einen filename

Code: Alles auswählen

def wordpress_bild(pfad, bildname, bildtyp):
    # Pfad zum Bild '../Wordpress-Blog/default-avatar.png'
    filename = pfad

    # Metadaten zum Bild / mimetype = Rumpf einer Nachricht - Etwas mehr in der WP Doku 'picture.jpg' 'image/jpeg'
    data = {'name': bildname,'type': bildtyp}  

    # read the binary file and let the XMLRPC library encode it into base64
    with open(filename, 'rb') as img:
        data['bits'] = xmlrpc_client.Binary(img.read())
        
    # Alle Daten zum Bild, die hochgeladen werden
    response = client.call(media.UploadFile(data))
    # dict
    #print response, type(response)

    attachment_id = response['id']
    return attachment_id
Das Label soll jedes Mal neu erzeugt werden, wenn ich ein Bild aussuche, damit ich sehe woher es kommt. der_pfad = pfad ist total unnötig, keine Ahnung was ich mir dabei gedachte habe :D global ist nicht so toll ich weiß, ändere ich noch!

Nochmal zum Endziel vielleicht hilft es mehr, wobei ich selber drauf kommen will.

Ich will: diese Funktion ruft sich per Button klick auf, ich kann den Pfad selber aussuchen (also das Bild) dann den Bildtyp und Bildnamen (gehören dazu und braucht die wordpress methode) UND ich will auch die width und heigt aussuchen jedesmal! ABER jedes Bild soll erstmal 10 x kleiner sein! Dann wird es einen Button geben, der das kleine Bild dann proportional hochscaled wieder wenn ich auf einen neuen Button klicke. D.h. ich habe zwei labels da steht dann zu dem Bild width: 29 heigth 29, dann klick ich nen Pfeil und width geht auf 30 und height auf 30, klicke ich nochmal drauf geht es auf 31 und 31 usw.

Wenn ich dann die SIZE ausgewählt habe und auf Posten klicke wird das Bild mit der aktuellen size gepostet also 31x31. Um das aber zu Posten braucht Wordpress einen Pfad! und kein Bild, d.h. ich muss es wieder speicher und den pfad überschreiben! Das Bild wieder aber schwarz (siehe update erster Post von mir)

Vielen Dank Sirius3!
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@Zoja: schau doch mal genau, was die Funktion wordpress_bild macht. Und statt jedesmal ein neues Label zu erzeugen, kann man eins auch wiederverwenden.
Zoja
User
Beiträge: 145
Registriert: Freitag 28. Februar 2014, 14:04

Sirius3 hat geschrieben:@Zoja: schau doch mal genau, was die Funktion wordpress_bild macht. Und statt jedesmal ein neues Label zu erzeugen, kann man eins auch wiederverwenden.
Okay ich denke ich weiß worauf du hinaus willst, PIL hier zu benutzen und Image.open ist Bullshit, da das Bild geöffent wird und zwar mit

Code: Alles auswählen

    # read the binary file and let the XMLRPC library encode it into base64
    with open(filename, 'rb') as img:
        data['bits'] = xmlrpc_client.Binary(img.read())
D.h. ich muss hier die resize Methoden von der XMLRPC library benutzen. Bin schon am recherchieren.

Im Endeffekt braucht dann die Methode wordpress_bild 2 zusätzliche Argumente für width und heigth.
Ich mache mich mal auf die Suche wie in der XMLRPC resized wird!
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@Zoja: nein, XMLRPC kann kein Bild resizen. Ich will darauf raus, dass Du die Bilddaten direkt als Bytestring angeben kannst, weil die Funktion auch nichts anderes macht, als eine Datei zu lesen. Damit sparst Du Dir das Speichern auf Platte, nicht aber das Lesen des Bildes mit Image.open.
Antworten