前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Http服务传输图片的Python实现

Http服务传输图片的Python实现

作者头像
py3study
发布2020-01-13 11:07:30
5.2K0
发布2020-01-13 11:07:30
举报
文章被收录于专栏:python3python3python3

Http服务传输图片的Python实现

介绍

主要介绍Python实现的Http服务传输图片的2种方式:URL和字节流

以URL的方式传输图片

服务器端

基于tornado框架搭建简单的web服务, 提供post方法, 通过接收image_url字段获取图片的url,通过requests模块获取图片并进行后续的操作。图片的操作重点关注process()方法。

#!/usr/bin/python
# -*-coding=utf-8 -*-

import sys
import traceback
from StringIO import StringIO

import requests
import tornado
import tornado.ioloop
import tornado.web
from tornado.escape import json_encode
from PIL import Image

reload(sys)
sys.setdefaultencoding('utf8')


class Handler(tornado.web.RequestHandler):

    def post(self):
        result = {}
        image_url = self.get_argument("image_url", default="")
        print image_url
        if not image_url:
            result["msg"] = "no image url"
        else:
            result["msg"] = self.process(image_url)
        self.write(json_encode(result))

    def process(self, image_url):
        """
        根据image_url获取图片进行处理

        :param image_url: 图片url
        """
        try:
            response = requests.get(image_url)
            if response.status_code == requests.codes.ok:
                obj = Image.open(StringIO(response.content))
                # TODO 根据obj进行相应的操作
                return "ok"
            else:
                return "get image failed."
        except Exception as e:
            print traceback.format_exc()
            return str(e)

class ImageServer(object):

    def __init__(self, port):
        self.port = port

    def process(self):
        app = tornado.web.Application([(r"/image?", Handler)], )
        app.listen(self.port)
        tornado.ioloop.IOLoop.current().start()

if __name__ == "__main__":
    server_port = "6060"
    server = ImageServer(server_port)
    print "begin server"
    server.process()

客户端

向服务器端的HTTP服务发送POST请求, 请求字段定义image_url。

#!/usr/bin/python
# -*-coding=utf-8 -*-

import json
import urllib
import urllib2


def post(server_url, params):
    data = urllib.urlencode(params)
    request = urllib2.Request(server_url, data)
    return json.loads(urllib2.urlopen(request, timeout=10).read())


if __name__ == "__main__":
    # 图片的URL
    image_url = "https://ss0.bdstatic.com/70cFvHSh_Q1YnxGkpoWK1HF6hhy/it/u=2637851855,2992656155&fm=200&gp=0.jpg"
    # http服务的URL
    url = "http://10.10.20.20:6060/image?"
    print post(url, {"image_url": image_url})

以字节流方式传输图片

pickle模块和requests模块

服务器端

基于tornado的HTTP服务, 提供content参数,获取打包的图片内容,利用pickle.loads()方法获取图片内容,之后进行后续的操作。 HTTP搭建方式同URL方式, 简单修改post方法

# 其他部分参考上文URL服务的搭建方式
    def post(self):
        result = {}
        content = self.get_argument("content", default=None)
        if content is None:
            result["msg"] = "no image content"
        else:
            result["msg"] = self.content_process(content)
        self.write(json_encode(result))

    def content_process(self, image_content):
        """
        根据image_content进行相应操作

        :param image_content: 图片内容
        """
        try:
            content = pickle.loads(image_content)
            image = Image.open(StringIO(content))
            print image
            #TODO 根据image进行相应操作
            return "ok"
        except Exception as e:
            print traceback.format_exc()
            return str(e)
客户端

将本地图片文件利用pickle模块打包, 传送给服务器端进行处理; 利用requests模块获取远程图片并打包数据, 传送给服务器端进行处理。示例代码如下:

#!/usr/bin/python
# -*-coding=utf-8 -*-

import json
import urllib
import urllib2
import requests
import pickle


def post(server_url, params):
    data = urllib.urlencode(params)
    request = urllib2.Request(server_url, data)
    return json.loads(urllib2.urlopen(request, timeout=10).read())


def remote_image(server_url, image_url):
    """
    网络图片处理

    :param server_url: 服务器端HTTP服务URL
    :param image_url: 图片URL
    """
    content = requests.get(image_url)
    params = {"content": content}
    print post(server_url, params)


def local_image(server_url, image_path):
    """
    本地图片处理

    :param server_url: 服务器端HTTP服务URL
    :param image_path: 图片本地地址
    """
    r_file = open(image_path, "rb")
    content = pickle.dumps(r_file.read())
    params = {"content": content}
    print post(server_url, params)


if __name__ == "__main__":
    url = "http://localhost:6060/image?"

    # local image
    file_path = "D:\\log\\fastText.PNG"
    local_image(url, file_path)

    # remote image
    remote_url = "https://ss0.bdstatic.com/70cFvHSh_Q1YnxGkpoWK1HF6hhy/it/u=2637851855,2992656155&fm=200&gp=0.jpg"
    remote_image(url, remote_url)

详情参考: http://www.tornadoweb.org/en/stable/

http://www.python-requests.org/en/master/

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-07-22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Http服务传输图片的Python实现
    • 介绍
      • 以URL的方式传输图片
        • 服务器端
        • 客户端
      • 以字节流方式传输图片
        • pickle模块和requests模块
    相关产品与服务
    图片处理
    图片处理(Image Processing,IP)是由腾讯云数据万象提供的丰富的图片处理服务,广泛应用于腾讯内部各产品。支持对腾讯云对象存储 COS 或第三方源的图片进行处理,提供基础处理能力(图片裁剪、转格式、缩放、打水印等)、图片瘦身能力(Guetzli 压缩、AVIF 转码压缩)、盲水印版权保护能力,同时支持先进的图像 AI 功能(图像增强、图像标签、图像评分、图像修复、商品抠图等),满足多种业务场景下的图片处理需求。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档