添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

格式转换

更新时间:

通过格式转换参数,您无需将图片下载到本地进行转换,只需指定 URL 转换存储在 OSS 内原图的格式。本文介绍对图片进行格式转换时所用到的参数及示例。

使用场景

  • 适应不同设备和平台:不同设备和平台支持不同图片格式。通过 OSS 图片格式转换,确保图片在各种终端上的兼容性和最佳显示效果。

  • 节省存储成本:某些图片格式(如 WebP)在保证视觉质量的前提下,文件大小较小。通过格式转换功能,可以减少存储空间占用,降低存储成本。

  • 统一资源管理:在电商、社交、媒体等行业中,您可以将上传的图片统一转换成指定格式,便于后续管理和分发。

注意事项

  • 图片处理包含缩放操作时,建议将格式转换参数放在处理参数的最后。例如 image/resize,w_100/format,jpg

  • 图片处理同时包含缩放和水印操作时,格式转换参数应添加在缩放参数之后。例如 image/resize,w_100/format,jpg/watermark,...

  • 如果原图没有透明通道,转换成 PNG、Web、BMP 等存在透明通道的格式时,默认会把透明填充成白色。请注意,OSS 不支持将透明色填充为黑色。

操作方式

您可以通过文件 URL、SDK、API 方式设置图片处理参数。使用文件 URL 仅适用于公共访问的图片。如果是私有访问的图片,请使用 SDK、API 处理图片。更多信息,请参见 图片处理操作方式

公共读图片

对于公共读的图片,可以直接在图片 URL 后添加处理参数,以允许任何人永久匿名访问处理后的图片。

以下是公共读图片 URL 添加 ?x-oss-process=image/format,parame_value 参数的操作说明,您只需要根据您的业务需求将 parame_value 替换为具体的参数和值,同时,支持多个参数之间的组合使用。

原始图片 URL

添加处理参数后的图片 URL

https://oss-console-img-demo-cn-hangzhou-3az.oss-cn-hangzhou.aliyuncs.com/example.gif

https://oss-console-img-demo-cn-hangzhou-3az.oss-cn-hangzhou.aliyuncs.com/example.gif?x-oss-process=image/format,png

私有图片

您可以通过阿里云 SDK 以及 REST API 对私有图片进行格式转换。

使用阿里云 SDK

以下仅列举常见 SDK 转换图片格式的代码示例。如需使用其他 SDK 转换图片格式的代码示例,请参见 SDK 简介

Java

要求使用 3.17.4 及以上版本的 Java SDK。

import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.GetObjectRequest;
import java.io.File;
public class Demo {
    public static void main(String[] args) throws Throwable {
        // Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // 填写Endpoint对应的Region信息,例如cn-hangzhou。
        String region = "cn-hangzhou";
        // 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // 填写Bucket名称,例如examplebucket。
        String bucketName = "examplebucket";
        // 填写Object完整路径。Object完整路径中不能包含Bucket名称。
        String objectName = "src.gif";
        // 填写本地文件的完整路径,例如D:\\dest.jpg。如果指定的本地文件存在会覆盖,不存在则新建。
        String pathName = "D:\\dest.png";
        // 创建OSSClient实例。
        // 当OSSClient实例不再使用时,调用shutdown方法以释放资源。
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
        OSS ossClient = OSSClientBuilder.create()
                .endpoint(endpoint)
                .credentialsProvider(credentialsProvider)
                .clientConfiguration(clientBuilderConfiguration)
                .region(region)
                .build();
        try {
            // 将原图转换为PNG格式。
            String image = "image/format,png";
            GetObjectRequest request = new GetObjectRequest(bucketName, objectName);
            request.setProcess(image);
            // 将处理后的图片命名为dest.png并保存到本地。
            // 如果未指定本地路径只填写了文件名称(例如dest.png),则文件默认保存到示例程序所属项目对应本地路径中。
            ossClient.getObject(request, new File("D:\\dest.png"));
        } catch (OSSException oe) {
            System.out.println("Caught an OSSException, which means your request made it to OSS, "
                    + "but was rejected with an error response for some reason.");
            System.out.println("Error Message:" + oe.getErrorMessage());
            System.out.println("Error Code:" + oe.getErrorCode());
            System.out.println("Request ID:" + oe.getRequestId());
            System.out.println("Host ID:" + oe.getHostId());
        } catch (ClientException ce) {
            System.out.println("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + "such as not being able to access the network.");
            System.out.println("Error Message:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
}

PHP

要求使用 PHP SDK 2.7.0 及以上版本。

<?php
if (is_file(__DIR__ . '/../autoload.php')) {
    require_once __DIR__ . '/../autoload.php';
if (is_file(__DIR__ . '/../vendor/autoload.php')) {
    require_once __DIR__ . '/../vendor/autoload.php';
use OSS\Credentials\EnvironmentVariableCredentialsProvider;
use OSS\OssClient;
// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
$provider = new EnvironmentVariableCredentialsProvider();
// yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
$endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 填写Bucket名称,例如examplebucket。
$bucket= "examplebucket";
// 填写Object完整路径。Object完整路径中不能包含Bucket名称。
$object = "src.gif";
// 填写本地文件的完整路径,例如D:\\dest.png。如果指定的本地文件存在会覆盖,不存在则新建。
// 如果未指定本地路径只填写了本地文件名称(例如dest.png),则文件默认保存到示例程序所属项目对应本地路径中。
$download_file = "D:\\dest.png";
$config = array(
        "provider" => $provider,
        "endpoint" => $endpoint,        
        "signatureVersion" => OssClient::OSS_SIGNATURE_VERSION_V4,
        // 填写阿里云通用Region ID。
        "region" => "cn-hangzhou"
$ossClient = new OssClient($config);
// 将原图转换为PNG格式。
$image = "image/format,png";
$options = array(
    OssClient::OSS_FILE_DOWNLOAD => $download_file,
    OssClient::OSS_PROCESS => $image);
// 将处理后的图片保存到本地。
$ossClient->getObject($bucket, $object, $options);                           

Python

要求使用 Python SDK 2.18.4 及以上版本。

# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
# 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
# yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
## 填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
endpoint = 'https://oss-cn-hangzhou.aliyuncs.com'
# 填写阿里云通用Region ID。
region = 'cn-hangzhou'
bucket = oss2.Bucket(auth, endpoint, 'examplebucket', region=region)
# 指定原图名称。如果图片不在Bucket根目录,需携带图片完整路径,例如exampledir/src.gif。
key = 'src.gif'
# 指定处理后的图片名称。
new_pic = 'D:\\dest.png'
# 将原图转换为PNG格式。
image = 'image/format,png'
bucket.get_object_to_file(key, new_pic, process=image)

Go

要求使用 Go SDK 3.0.2 及以上版本。

package main
import (
	"fmt"
	"github.com/aliyun/aliyun-oss-go-sdk/oss"
func HandleError(err error) {
	fmt.Println("Error:", err)
	os.Exit(-1)
func main() {
	// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	// 创建OSSClient实例。
	// yourEndpoint填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
	client, err := oss.New("https://oss-cn-hangzhou.aliyuncs.com", "", "", oss.SetCredentialsProvider(&provider), oss.AuthVersion(oss.AuthV4), oss.Region("cn-hangzhou"))
	if err != nil {
		HandleError(err)
	// 指定原图所在的Bucket名称,例如examplebucket。
	bucketName := "examplebucket"
	bucket, err := client.Bucket(bucketName)
	if err != nil {
		HandleError(err)
	// 指定原图名称。如果图片不在Bucket根目录,需携带图片完整路径,例如exampledir/src.gif。
	sourceImageName := "src.gif"
	// 指定处理后的图片名称。
	targetImageName := "D://dest.png"
	// 将原图转换为PNG格式。
	image := "image/format,png"
	err = bucket.GetObjectToFile(sourceImageName, targetImageName, oss.Process(image))
	if err != nil {
		HandleError(err)
}

使用 REST API

如果您的程序自定义要求较高,您可以直接发起 REST API 请求。直接发起 REST API 请求需要手动编写代码计算签名,关于公共请求头 Authorization 的计算方法,请参见 签名版本 4(推荐)

您可以通过在 GetObject 接口中添加格式转换参数的方式来处理图片。更多信息,请参见 GetObject

GET /oss.jpg?x-oss-process=image/format,png HTTP/1.1
Host: oss-example.oss-cn-hangzhou.aliyuncs.com
Date: Fri, 28 Oct 2022 06:40:10 GMT
Authorization: AuthorizationValue

参数说明

操作名称: format

取值范围

描述

jpg

将原图保存为 JPG 格式。

重要

不支持将存在透明通道的 HEIC 格式的图片保存为 JPG 格式。

png

将原图保存为 PNG 格式。

webp

将原图保存为 WebP 格式。

bmp

将原图保存为 BMP 格式。

gif

原图为 GIF 图片则继续保存为 GIF 格式;原图不是 GIF 图片,则按原图格式保存。

tiff

将原图保存为 TIFF 格式。

heic

将原图保存为 HEIF 格式。

说明

仅华北 3(张家口)、华东 2(上海)、华南 1(深圳)、华东 1(杭州)、华北 2(北京)、新加坡地域支持 HEIF 格式。

avif

将原图保存为 AVIF 格式。

说明

仅华北 3(张家口)、华东 2(上海)、华南 1(深圳)、华东 1(杭州)、华北 2(北京)、新加坡地域支持 AVIF 格式。

使用示例

原图转换为 PNG 格式

处理参数如下:

  • 图片转换为 PNG 格式: format,png

对于公共读写图片,您可以在图片 URL 末尾添加 ?x-oss-process=image/format,png ,OSS 将实时处理该图片,返回处理后的结果。如果您想对您的私有图片进行格式转换,请参见 私有图片

效果示例

以下在原图 URL 后拼接 ?x-oss-process=image/format,png 参数将 GIF 图片转换为 PNG 格式:

原图

处理后的图片

gif

png

原图 URL:

https://oss-console-img-demo-cn-hangzhou-3az.oss-cn-hangzhou.aliyuncs.com/example.gif

图片处理 URL: https://oss-console-img-demo-cn-hangzhou-3az.oss-cn-hangzhou.aliyuncs.com/example.gif?x-oss-process=image/format,png

原图转换为 JPG 格式并渐进显示

处理参数如下:

  • 图片转换为 JPG 格式: format,jpg

  • 图片设置为渐进显示: interlace,1

对于公共读写图片,您可以在图片 URL 末尾添加 ?x-oss-process=image/interlace,1/format,jpg ,OSS 将实时处理该图片,返回处理后的结果。如果您想对您的私有图片进行格式转换,请参见 私有图片

效果示例

以下在原图 URL 后拼接 ?x-oss-process=image/interlace,1/format,jpg 参数将 GIF 图片转换成 JPG 格式,并支持渐进显示:

原图

处理后的图片

gif

image

原图 URL:

https://oss-console-img-demo-cn-hangzhou-3az.oss-cn-hangzhou.aliyuncs.com/example.gif

图片处理 URL: https://oss-console-img-demo-cn-hangzhou-3az.oss-cn-hangzhou.aliyuncs.com/example.gif?x-oss-process=image/interlace,1/format,jpg

原图转换为 WebP 格式并缩放

处理参数如下:

  • 图片转换为 WebP 格式: format,webp

  • 图片缩放为宽 200 px: resize,w_200

对于公共读写图片,您可以在图片 URL 末尾添加 ?x-oss-process=image/resize,w_200/format,webp 时,OSS 将实时处理该图片,返回处理后的结果。如果您想对您的私有图片进行格式转换,请参见 私有图片

效果示例

以下在原图 URL 后拼接 x-oss-process=image/resize,w_200/format,webp 参数将 GIF 原图缩放为宽 200 px,并转换为 WebP 格式:

原图

处理后的图片

gif

原图 URL:

https://oss-console-img-demo-cn-hangzhou-3az.oss-cn-hangzhou.aliyuncs.com/example.gif

图片处理 URL:

https://oss-console-img-demo-cn-hangzhou-3az.oss-cn-hangzhou.aliyuncs.com/example.gif?x-oss-process=image/resize,w_200/format,webp

常见问题

图片格式转换时出现黑边怎么办?

图片格式有默认质量,进行格式转换时如果没有指定质量,将按照默认质量进行转换,此时可能会出现图片有黑边的情况。

如果您希望提升图片质量,建议您转换格式时同步将质量指定为 100(?x-oss-process=image/quality,Q_100)。关于质量变换的更多信息,请参见 质量变换

图片格式转换的处理过程是否会影响页面加载速度?

图片格式转换的处理过程会影响您的页面加载速度。

GIF 可以转换 MP4 格式么?

如果需要将 GIF 转换成 MP4 格式,请 提交工单 申请。