2017-07-04 61 views
9

Próbuję zaimplementować punkt końcowy backendu Flask, do którego można załadować dwa obrazy, tło i pierwszy plan (pierwszy plan ma przezroczyste tło), a następnie wklei pierwszy plan na wierzchu tło. Mam następujący kod Pythona, który Ja testowałem z plików lokalnych i działa:Alamofire przesyła PNG do kolby z białym tłem

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") 

Jednak gdy próbuję przesłać te same obrazy poprzez Alamofire i następujący kod:

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)") 
     } 
    }) 

pojawia Na pierwszym planie

na białym tle zamiast przezroczystego tła, a wynikowy obraz to tylko pierwszy plan na białym tle. Jak mogę poprosić Alamofire o wysłanie transparentności?

EDYCJA: Próbowałem przetłumaczyć to na żądanie cURL i działa zgodnie z oczekiwaniami. Użyłem nc-l localhost 8080, aby wyświetlić pełne żądanie, i wydaje się, że na pierwszym planie, mimo że Content-Type został ustawiony na "application/octet-stream", następną linią był "? PNG". Ta linia nie była obecna na żądanie Alamofire. Jak mogę uzyskać żądanie rozpoznania obrazu jako PNG?

Odpowiedz

4

Nie mogę uwierzyć, że to robi, ale kiedy było uzyskanie danych obrazowych, używałem

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

Była to jedyna droga, jaką kiedykolwiek uzyskano danych z obrazu w Swift, nawet chociaż oczywiście powinno to być to, co zmieniłem na:

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

Tak, zmiana png na JPG spowoduje to. –

+0

Kto by pomyślał! – genghiskhan