Alamofire 将 PNG 上传到具有白色背景的 Flask
Alamofire Uploads PNG to Flask with White Background
我正在尝试实现一个 Flask 后端端点,可以在其中上传两张图片,一张背景和一张前景(前景有透明背景),它会将前景粘贴到背景之上。我有以下 Python 代码,我已经用本地文件测试过并且有效:
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")
但是,当我尝试通过 Alamofire 和以下代码上传相同的图像时:
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)")
}
})
前景显示为白色背景而不是透明背景,生成的图像只是背景为白色的前景。如何让 Alamofire 发送透明度?
编辑:
我尝试将其转换为 cURL 请求,它按预期工作。我用nc -l localhost 8080 查看了完整的请求,看起来和前景图片一样,尽管Content-Type设置为"application/octet-stream",但下一行是“?PNG”。 Alamofire 请求中没有这一行。如何获得将图像识别为 PNG 的请求?
我不敢相信我正在这样做,但是当我获取图像数据时,我正在使用
let fgData = UIImageJPEGRepresentation(UIImage(named: "overlay.png"), 0.75)
这是我从 Swift 中的图像获取数据的唯一方法,尽管显然我应该将其更改为:
let fgData = UIImagePNGRepresentation(UIImage(named: "overlay.png"))
我正在尝试实现一个 Flask 后端端点,可以在其中上传两张图片,一张背景和一张前景(前景有透明背景),它会将前景粘贴到背景之上。我有以下 Python 代码,我已经用本地文件测试过并且有效:
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")
但是,当我尝试通过 Alamofire 和以下代码上传相同的图像时:
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)")
}
})
前景显示为白色背景而不是透明背景,生成的图像只是背景为白色的前景。如何让 Alamofire 发送透明度?
编辑: 我尝试将其转换为 cURL 请求,它按预期工作。我用nc -l localhost 8080 查看了完整的请求,看起来和前景图片一样,尽管Content-Type设置为"application/octet-stream",但下一行是“?PNG”。 Alamofire 请求中没有这一行。如何获得将图像识别为 PNG 的请求?
我不敢相信我正在这样做,但是当我获取图像数据时,我正在使用
let fgData = UIImageJPEGRepresentation(UIImage(named: "overlay.png"), 0.75)
这是我从 Swift 中的图像获取数据的唯一方法,尽管显然我应该将其更改为:
let fgData = UIImagePNGRepresentation(UIImage(named: "overlay.png"))