2017-07-04 5 views
9

Ich versuche, einen Flask Backend Endpunkt zu implementieren, wo zwei Bilder hochgeladen werden können, einen Hintergrund und einen Vordergrund (der Vordergrund hat einen transparenten Hintergrund), und es wird den Vordergrund oben einfügen der Hintergrund. Ich habe folgende Python-Code, den ich mit lokalen Dateien getestet und funktioniert:Alamofire lädt PNG in Flask mit weißem Hintergrund

background_name = request.args.get("background") 
overlay_name = request.args.get("overlay") 
output_name = request.args.get("output") 

background_data = request.files["background"].read() 
overlay_data = request.files["overlay"].read() 

background = Image.open(BytesIO(background_data)) 
overlay = Image.open(BytesIO(overlay_data)) 

background = background.convert("RGBA") 
overlay = overlay.convert("RGBA") 

overlay = resize_image(overlay, background.size) 
background.paste(overlay, (0, 0, background.size[0], background.size[1],), overlay) 
background.save(output_name, "PNG") 

Allerdings, wenn ich versuchen, die gleichen Bilder durch Alamofire und den folgenden Code laden:

Alamofire.upload(multipartFormData: { formData in 
     formData.append(bgData, withName: "background", fileName: "background.jpg", mimeType: "image/jpeg") 
     formData.append(fgData, withName: "foreground", fileName: "foreground.png", mimeType: "image/png") 
    }, to: "http://localhost:8080/image_overlay?background=background%2Ejpg&overlay=overlay%2Epng&output=result%2Epng", encodingCompletion: { result in 
     switch result { 
     case .success(let upload, _, _): 
      upload.validate().responseJSON(completionHandler: { response in 
       switch response.result { 
       case .success(let value): print("success: \(value)") 
       case .failure((let error)): print("response error \(error)") 
       } 
      }) 
     case .failure(let error): 
      print("encoding error \(error)") 
     } 
    }) 

Der Vordergrund erscheint mit einem weißen Hintergrund anstelle eines transparenten Hintergrunds und das resultierende Bild ist nur der Vordergrund mit einem weißen Hintergrund. Wie kann ich Alamofire dazu bringen, die Transparenz zu senden?

EDIT: Ich habe versucht, dies in eine cURL Anfrage zu übersetzen und es funktioniert wie erwartet. Ich habe nc-l localhost 8080 verwendet, um die vollständige Anfrage anzuzeigen, und es scheint, dass mit dem Vordergrundbild, obwohl der Inhaltstyp auf "application/octet-stream" eingestellt war, die nächste Zeile "? PNG" war. Diese Linie war von der Alamofire-Anfrage nicht vorhanden. Wie kann ich die Anfrage erhalten, das Bild als PNG zu erkennen?

Antwort

4

Ich kann nicht glauben, dass ich das tut, aber wenn ich auf den Bilddaten wurde zu erhalten, war ich mit

let fgData = UIImageJPEGRepresentation(UIImage(named: "overlay.png"), 0.75) 

Das war der einzige Weg, den ich je Daten aus einem Bild in Swift erhalten hatte, auch obwohl offensichtlich sollte es sein, was ich es geändert habe:

let fgData = UIImagePNGRepresentation(UIImage(named: "overlay.png")) 
+0

Ja, ein png in ein jpg drehen wird dazu führen. –

+0

Wer hätte das gedacht! – genghiskhan

Verwandte Themen