作者:除却巫山不是云啊
在阿里云 Serverless 函数核算服务中布置一般图片转素描图的函数服务,完成批量上传到指定 OSS 桶内的图片主动转换为素描图并保存到另一个 OSS 桶内。
场景介绍
小明接到学校教师安排的使命,需求批量将班级里同学们拍的一般相片转换为素描图,供讲堂游戏运用,所以求助到程序员老爸,机敏的程序员老爸分分钟用几行 Python 代码处理:在阿里云Serverless 函数核算服务中布置一般图片转素描图函数服务,完成将批量上传到指定 OSS 桶内的图片主动转换为素描图并保存到另一个 OSS 桶内。
本文适合了解阿里云 Serverless、OSS、函数核算 FC 产品,有一定的云核算实践经历及 Python 编程经历的读者,了解阿里云鉴权体系及图片处理 OpenCV 库的个人开发者。
相关概念
Serverless:全称 Serverless computing,即无服务器核算,是云核算的一种新模式,差异于传统的 IaaS、PaaS、SaaS。无服务器运算不代表它真的不需求服务,而是指一般开发者不用过多考虑服务器、App 运转环境及各种周边依靠问题,核算资源真正成为一种服务而不是服务器或者容器。它允许开发者在以办理某个具体功用函数的粒度进行布置及运维办理,以便让开发者专心于中心业务逻辑,更快速地开发应用。
Function Compute:前面讲的 Serverless 是一种抽象层次更高说法,“FaaS + BaaS”是 Serverless 架构模式的一种完成,阿里云 Function Compute 便是典型的 FaaS,配合阿里云丰厚的 BaaS(SLS、OSS、RDS 等)服务,可以非常快速的布置应用。
函数核算FC是一种基于事情驱动的全托管核算服务,用户无需收购与办理服务器等基础设施,只需编写并上传代码。函数核算FC 运用核算、存储资源,弹性地、可靠地运转使命,并供给日志查询、性能监控和报警等功用。
环境预备
前提条件
-
已注册阿里云函数核算 FC、OSS、SLS 服务
-
提前预备好一般图片转换为素描图的 Python 代码
-
提前预备好测验图片
-
提前创立好两个测验用的 OSS 桶(不能将转换后的图片上传到同一个OSS bucket中,这会导致函数被无限循环履行)
操作过程
过程一:创立阿里云函数核算 FC 服务
- 挑选函数及服务点击“创立服务”,填写名称和描述:
- 进入函数办理,点击“创立函数”:
运转环境挑选 Python 3.6,代码上传方式挑选运用示例代码,请求处理程序类型挑选处理事情请求:
触发器挑选 OSS,Bucket 挑选提前创立好的“sketch-image-input”,文件后缀为 .jpg,防止其他类型的文件上传后误触发函数履行。
授权角色。
- 测验默许供给的 Python 函数,了解下基本功用:
过程二:编写 Python 脚本,完成一般图片转换为素描图函数
- 在编辑器中,输入提前写好的 Python 代码:
参阅代码如下:
# -*- coding: utf-8 -*-
import cv2
import json
import logging
import oss2
def sketch_image(source_image, target_image):
# read image
image = cv2.imread(source_image)
# sketch image
grey_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
invert_image = cv2.bitwise_not(grey_image)
gaussian_blur_image = cv2.GaussianBlur(invert_image, (7, 7), 0)
inverse_image = cv2.bitwise_not(gaussian_blur_image)
sketch_image_result = cv2.divide(grey_image, inverse_image, scale=256.0)
# save image
cv2.imwrite(target_image, sketch_image_result)
cv2.waitKey(0)
cv2.destroyAllWindows()
def handler(event, context):
logger = logging.getLogger()
evt = json.loads(event)
creds = context.credentials
# Required by OSS sdk
auth=oss2.StsAuth(
creds.access_key_id,
creds.access_key_secret,
creds.security_token)
evt = evt['events'][0]
bucket_name = evt['oss']['bucket']['name']
endpoint = 'oss-' + evt['region'] + '.aliyuncs.com'
bucket_input = oss2.Bucket(auth, endpoint, bucket_name)
bucket_output = oss2.Bucket(auth, endpoint, 'sketch-image-ouput')
logger.info('oss endpoint: %s' % endpoint)
objectName = evt['oss']['object']['key']
logger.info('oss objectName: %s' % objectName)
newKey = 'sketch_' + objectName
# Download image
source_image = '/tmp/%s' % objectName
bucket_input.get_object_to_file(objectName, source_image)
logger.info('download image %s success.' % source_image)
# Sketch image
target_image = '/tmp/%s' % newKey
sketch_image(source_image, target_image)
# Upload image
with open(target_image, 'rb') as fileobj:
bucket_output.put_object(newKey, fileobj)
logger.info('upload image %s success.' % newKey)
函数编写过程中,参阅了阿里云供给的 SDK 案例,内容非常丰厚,想要的功用都有,且阿里云函数核算 FC 供给的 Python 运转环境内置 OSS、OpenCV 等常用模块,很好的支撑一般开发者快速完成功用,点赞:
[1] 阿里云 FC 运用 OSS 触发器 SDK:
help.aliyun.com/document_de…
[2] OSS 文件下载、上传 SDK:
help.aliyun.com/document_de…
[3] FC Python 环境内置模块:
help.aliyun.com/document_de…
- 布置代码并注册 SLS 日志服务,便于调试代码时检查日志,真的很便利:
方案验证
- 上传本地测验图片到 OSSsketch-image-input 桶中:
- 观察函数sketch_image 调用日志信息及监控信息:
- 检查 OSSsketch-image-output 桶内转换后的素描图,效果还不错:
- 批量上传图片测验,函数功用很稳定:
本文选自“Serverless 函数核算搜集令”征文
ServerlessDeveloper Meetup
2022 阿里云 Serverless Developer Meetup 杭州站火热报名中!
本次沙龙特别邀请到阿里云、高德地图的 Serverless 一线技能专家,共享当时 Serverless 架构 CICD 的最新探索研究;带来 Serverless 在高德业务体系中的降本增效实践;全视角解析 Serverless 原子化能力是如何提升研制效能,增强开发幸福感。更有 Serverless Workshop 等你来玩,手把手带你体会 1 分钟极速布置的乐趣,感触 Severless 算力之美。免费报名即可参加活动,我们预备了超多周边礼品,等你一起来 Serverless!
- 时刻:9月17日(周六)13:00
- 地点:阿里巴巴西溪园区B区访客中心
点击此处,立即报名!