All Products
Search
Document Center

Object Storage Service:QR code recognition

Last Updated:Jun 19, 2025

The QR code recognition feature detects multiple QR codes or barcodes in various images and returns their position and text information. In the output results, the system marks the position of each QR code or barcode and displays the text information it contains.

Overview

Intelligent Media Management (IMM) provides the QR code recognition feature that you can use to detect positions and content of one or more QR codes or barcodes from image files such as photos and screenshots and return the position information and text information that the codes convey. The position information contains the upper-left corner x-axis, upper-left corner y-axis, width, and height, as shown in the following figure.

  • QR code

    figqcode11

  • Barcode

    image

You can use the QR code recognition feature to implement QR code or barcode scanning and reading in your business applications. You can also develop features to block or pixelate QR codes or barcodes in images based on the QR code recognition feature.

Scenarios

  • Pay with QR codes: Payers can scan a QR code to complete payments.

  • Marketing and advertising with QR codes: Marketers and advertisers can add QR codes to posters and product packaging to promote products.

Usage notes

  • QR code recognition supports only synchronous processing (x-oss-process).

  • The maximum number of QR codes that can be identified in a single image is five.

  • Anonymous access will be denied.

How to use

Prerequisites

QR code recognition

Action: image/codes

Java

OSS SDK for Java 3.17.4 or later is required.

import com.aliyun.oss.ClientBuilderConfiguration;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.common.auth.CredentialsProviderFactory;
import com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.OSSObject;
import com.aliyun.oss.model.GetObjectRequest;
import com.aliyuncs.exceptions.ClientException;

import java.io.ByteArrayOutputStream;
import java.io.IOException;

public class Demo {
    public static void main(String[] args) throws ClientException, ClientException {
        // Specify the endpoint of the region in which the bucket is located.
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // Specify the region in which the bucket is located. Example: cn-hangzhou.
        String region = "cn-hangzhou";
        // Obtain access credentials from environment variables. Before you run the sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are configured.
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // Specify the name of the bucket.
        String bucketName = "examplebucket";
        // If the image is stored in the root directory of the bucket, enter the image name. If the image is not stored in the root directory of the bucket, you must specify the full path of the image. Example: exampledir/example.jpg.
        String key = "example.jpg";

        // Create an OSSClient instance.
         // Call the shutdown method to release resources when the OSSClient is no longer in use.
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
        OSS ossClient = OSSClientBuilder.create()
                .endpoint(endpoint)
                .credentialsProvider(credentialsProvider)
                .clientConfiguration(clientBuilderConfiguration)
                .region(region)
                .build();

        try {
            // Create a processing instruction to detect QR codes in an image.
            GetObjectRequest getObjectRequest = new GetObjectRequest(bucketName, key);
            getObjectRequest.setProcess("image/codes");

            // Use the getObject method, and pass the processing instruction by using the process parameter.
            OSSObject ossObject = ossClient.getObject(getObjectRequest);

            // Read and display the query results.
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            byte[] buffer = new byte[1024];
            int bytesRead;
            while ((bytesRead = ossObject.getObjectContent().read(buffer)) != -1) {
                baos.write(buffer, 0, bytesRead);
            }
            String imageCodes = baos.toString("UTF-8");
            System.out.println("Image Codes:");
            System.out.println(imageCodes);
        } catch (IOException e) {
            System.out.println("Error: " + e.getMessage());
        } finally {
            // Shut down the OSSClient instance.
            ossClient.shutdown();
        }
    }
}

Python

OSS SDK for Python 2.18.4 or later is required.

# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider

# Obtain access credentials from environment variables. Before you run the sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are configured.
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())

# Specify the endpoint for the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com.
endpoint = 'https://oss-cn-hangzhou.aliyuncs.com'
# Specify the ID of the Alibaba Cloud region in which the bucket is located.
region = 'cn-hangzhou'
bucket = oss2.Bucket(auth, endpoint, 'examplebucket', region=region)

# If the image is stored in the root directory of the bucket, enter the image name. If the image is not stored in the root directory of the bucket, you must specify the full path of the image. Example: exampledir/example.jpg.
key = 'example.jpg'

# Create a processing instruction to detect QR codes in an image.
process = 'image/codes'

try:
    # Use the get_object method and pass the processing instruction by using the process parameter.
    result = bucket.get_object(key, process=process)

    # Read and display the query results.
    image_codes = result.read().decode('utf-8')
    print("Image Codes:")
    print(image_codes)
except oss2.exceptions.OssError as e:
    print("Error:", e)

Go

OSS SDK for Go 3.0.2 or later is required.

package main

import (
	"fmt"
	"io"
	"os"

	"github.com/aliyun/aliyun-oss-go-sdk/oss"
)

func main() {
	// Obtain temporary access credentials from the environment variables. Before you run the sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are configured.
	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
	// Create an OSSClient instance.
	// Specify the endpoint of the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. Specify your actual endpoint.
	// Specify the ID of the Alibaba Cloud region in which the bucket is located. Example: cn-hangzhou.
	client, err := oss.New("https://oss-cn-hangzhou.aliyuncs.com", "", "", oss.SetCredentialsProvider(&provider), oss.AuthVersion(oss.AuthV4), oss.Region("cn-hangzhou"))
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
	// Specify the name of the bucket. Example: examplebucket.
	bucketName := "examplebucket"

	bucket, err := client.Bucket(bucketName)
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
	// If the image is stored in the root directory of the bucket, enter the image name. If the image is not stored in the root directory of the bucket, you must specify the full path of the image. Example: exampledir/example.jpg.
	// Use the oss.Process method to create a processing instruction to detect QR codes in an image.
	body, err := bucket.GetObject("example.jpg", oss.Process("image/codes"))
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}

	defer body.Close()

	data, err := io.ReadAll(body)
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
	fmt.Println("data:", string(data))
}

PHP

OSS SDK for PHP 2.7.0 or later is required.

<?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;

try {
    // Obtain access credentials from environment variables. Before you run the sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are configured.
    $provider = new EnvironmentVariableCredentialsProvider(); 
    // Specify the endpoint of the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com.
    $endpoint = 'https://oss-cn-hangzhou.aliyuncs.com';
    // Specify the name of the bucket. Example: examplebucket.
    $bucket = 'examplebucket';
    // If the image is stored in the root directory of the bucket, enter the image name. If the image is not stored in the root directory of the bucket, you must specify the full path of the image. Example: exampledir/example.jpg.
    $key = 'example.jpg'; 

    $config = array(
        "provider" => $provider,
        "endpoint" => $endpoint,        
        "signatureVersion" => OssClient::OSS_SIGNATURE_VERSION_V4,
        // Specify the ID of the Alibaba Cloud region in which the bucket is located.
        "region" => "cn-hangzhou"
    );
    $ossClient = new OssClient($config);
  // Create a processing instruction to detect QR codes in an image.
  $options[$ossClient::OSS_PROCESS] = "image/codes";
  $result = $ossClient->getObject($bucket,$key,$options);
  var_dump($result);
} catch (OssException $e) {
  printf($e->getMessage() . "\n");
  return;
}

Parameters

Action: image/codes

Note

For more information about the response parameters, see DetectImageCodes.

Related API operations

If your business requires a high level of customization, you can directly call RESTful API operations. To directly call an API, you must include the signature calculation in your code. For more information about how to calculate the Authorization header, see (Recommended) Include a V4 signature.

You can process images by specifying the x-oss-process parameter in the GetObject request. For more information, see GetObject.

Sample requests

GET /example.jpg?x-oss-process=image/codes HTTP/1.1
Host: image-demo.oss-cn-hangzhou.aliyuncs.com
Date: Fri, 21 Jul 2023 08:56:50 GMT
Authorization: SignatureValue

Sample success responses

HTTP/1.1 200 OK
Server: AliyunOSS
Date: Fri, 21 Jul 2023 08:56:52 GMT
Content-Type: application/json;charset=utf-8
Content-Length: 64
Connection: keep-alive
x-oss-request-id: 64BA48531253C5383707D5B3
ETag: "2CE2EA370531B7CC1D23BE6015CF5DA5"
Last-Modified: Mon, 10 Jul 2023 13:07:30 GMT
x-oss-object-type: Normal
x-oss-hash-crc64ecma: 13420962247653419692
x-oss-storage-class: Standard
x-oss-ec: 0048-00000104
Content-Disposition: attachment
x-oss-force-download: true
x-oss-server-time: 453

{
  "RequestId" : "3B7BD09F-18D8-56F0-90B7-889FBD9FFF70",
  "Codes": [
    {
      "Content": "https://www.aliyun.com/product/imm",
      "Boundary": {
        "Width": 741,
        "Height": 706,
        "Left": 460,
        "Top": 295
      }
    }
  ]
}

Permissions

An Alibaba Cloud account has all permissions by default. Resource Access Management (RAM) users or RAM roles under an Alibaba Cloud account do not have any permissions by default. The Alibaba Cloud account or the administrator must grant permissions to RAM users or RAM roles by using RAM Policy or bucket policy.

  • Grant users permissions to access linked instances.

    • Grant the RAM user the permissions to perform operations in OSS.

      API

      Action

      Description

      GetObject

      oss:GetObject

      Downloads an object.

      kms:Decrypt

      When you download an object, if the object metadata contains X-Oss-Server-Side-Encryption: KMS, this permission is required.

      None

      oss:ProcessImm

      Allows the use of data processing capabilities of IMM in OSS.

      PostProcessTask

      oss:PostProcessTask

      Allows the use of data processing capabilities through POST requests, such as asynchronous processing (x-oss-async-process).

    • Grant users permissions to use the QR code recognition feature of IMM.

      API

      Action

      Description

      DetectImageCodes

      imm:DetectImageCodes

      Allows the use of QR code recognition in IMM.

  • Grant the role used by IMM (default is AliyunIMMDefaultRole, with resource ARN acs:ram:*:<account-id>:role/aliyunimmdefaultrole) permissions to access linked resources for data processing.

    API

    Action

    Description

    GetObject

    oss:GetObject

    Downloads an object.

    kms:Decrypt

    When you download an object, if the object metadata contains X-Oss-Server-Side-Encryption: KMS, this permission is required.

Billing

During QR code recognition, because the IMM service is called, billing items are generated on both OSS and IMM sides. The unit price varies based on regions:

  • OSS side: The following billing items are generated. For detailed pricing, see OSS Pricing:

    API

    Billable item

    Description

    GetObject

    GET requests

    You are charged request fees based on the number of successful requests.

    Outbound traffic over the Internet

    If you call the GetObject operation by using a public endpoint, such as oss-cn-hangzhou.aliyuncs.com, or an acceleration endpoint, such as oss-accelerate.aliyuncs.com, you are charged fees for outbound traffic over the Internet based on the data size.

    Retrieval of IA objects

    If IA objects are retrieved, you are charged IA data retrieval fees based on the size of the retrieved IA data.

    Retrieval of Archive objects in a bucket for which real-time access is enabled

    If you retrieve Archive objects in a bucket for which real-time access is enabled, you are charged Archive data retrieval fees based on the size of retrieved Archive objects.

    Transfer acceleration fees

    If you enable transfer acceleration and use an acceleration endpoint to access your bucket, you are charged transfer acceleration fees based on the data size.

  • IMM side: The following IMM billing items are generated:

    API

    Billing item

    Description

    DetectImageCodes

    ImageQRCodes

    You are charged request fees based on the number of successful requests.