Source code for jacinle.image.codecs

#! /usr/bin/env python3
# -*- coding: utf-8 -*-
# File   : codecs.py
# Author : Jiayuan Mao
# Email  : maojiayuan@gmail.com
# Date   : 01/19/2018
#
# This file is part of Jacinle.
# Distributed under terms of the MIT license.

from .backend import cv2, opencv_only
import numpy as np

__all__ = ['jpeg_encode', 'png_encode', 'imdecode']


[docs] @opencv_only def jpeg_encode(img, quality=90): """Encode the image with JPEG encoder. Args: img (:class:`numpy.ndarray`): uint8 color image array quality (int): quality for JPEG compression Returns bytes: encoded image data """ return cv2.imencode('.jpg', img, [int(cv2.IMWRITE_JPEG_QUALITY), quality])[1].tostring()
[docs] @opencv_only def png_encode(input, compress_level=3): """ Encode the image with PNG encoder. Args: img (:class:`numpy.ndarray`): uint8 color image array quality (int): quality for JPEG compression Returns bytes: encoded image data """ assert len(input.shape) == 3 and input.shape[2] in [3, 4] assert input.dtype == np.uint8 assert isinstance(compress_level, int) and 0 <= compress_level <= 9 enc = cv2.imencode('.png', input, [int(cv2.IMWRITE_PNG_COMPRESSION), compress_level]) return enc[1].tostring()
[docs] @opencv_only def imdecode(data, *, require_chl3=True, require_alpha=False): """Decode images in common formats (jpg, png, etc.). Args: data (bytes): encoded image data require_chl3: whether to convert gray image to 3-channel BGR image require_alpha: whether to add alpha channel to BGR image Returns: uint8 color image array """ img = cv2.imdecode(np.fromstring(data, np.uint8), cv2.IMREAD_UNCHANGED) assert img is not None, 'failed to decode' if img.ndim == 2 and require_chl3: img = img.reshape(img.shape + (1,)) if img.shape[2] == 1 and require_chl3: img = np.tile(img, (1, 1, 3)) if img.ndim == 3 and img.shape[2] == 3 and require_alpha: assert img.dtype == np.uint8 img = np.concatenate([img, np.ones_like(img[:, :, :1]) * 255], axis=2) return img