Windows下使用IJL编解码图片

IJL的全称是Intel JPEG Library,是Intel专门针对它自己的CPU优化过的JPEG编码库,速度非常之快,编码一张1080p的BMP图片,只需要十多毫秒的时间,这要比libjpeg这个开源库要块了2.5倍~3倍。

它的优点是:

1. 效率高——快到不可思议

2. 使用简单——就三个函数主要函数,可以完成BMP转JPEG,JPEG转BMP

  它的缺点是:

1. 目标单一 —— 专门针对Intel的CPU做了优化,在其他平台上无法使用(或者表现平平)

它的主要函数就以下四个:

IJLERR ijlInit (JPEG_CORE_PROPERTIES *jcprops); 

IJLERR ijlFree (JPEG_CORE_PROPERTIES *jcprops); 

IJLERR ijlRead (JPEG_CORE_PROPERTIES *jcprops, IJLIOTYPE iotype);

IJLERR ijlWrite (JPEG_CORE_PROPERTIES *jcprops, IJLIOTYPE iotype);
编解码过程中,只需要使用这四个函数即可完成JPEG的编解码。


下面,将给出实际的编解码例子,这些例子都是从实际的项目中扣下来的,可以完成每秒30+帧的编解码转换;

IJL库下载地址:点这里

《一》 BMP编码JPEG:

// 包含IJL的头文件和静态链接库
#include "ijl.h"
#pragma comment(lib, "ijl15l.lib")

// RGB24转JPG
// pBitmap  : RGB数据
// w, h     : 原始RGB图像的宽度和高度
// fScale   : 如果需要缩放图像,则指定缩放比率;如果不需要缩放图像,请设定为1.0
// nQuality : 编码JPEG的质量(100最高,0最低)
// pJpgBuf  : 输出参数,存储JPEG数据的缓冲区
// nJpgSize : 输入输出参数,用作输入时,表示pJpgBuf大小;用作输出时,表示编码后的JPEG图像大小
int IJL_RGB24ToJpg(BYTE *pBitmap, int w, int h, int nQuality, float fScale, BYTE *pJpgBuf, int &nJpgSize)
{
	int nRet = 0, nWidth = w, nHeight = h;
 
    JPEG_CORE_PROPERTIES jcprops;
    IJLERR jerr = ijlInit(&jcprops);
    if (IJL_OK != jerr)
    {
        ("ijlInit failed! jerr=%d\n", jerr);
        return -1;
    }
 
    do 
    {
        //保证缓冲区够大
        if (nWidth * nHeight * 2 > nJpgSize)
        {
            ("buffer too small\n");
            nRet = -1;
            break;
        }
 
        jcprops.DIBWidth       = nWidth;
        jcprops.DIBHeight      = nHeight;
        jcprops.DIBBytes       = pBitmap;
        jcprops.DIBPadBytes    = IJL_DIB_PAD_BYTES(nWidth, 3);
        jcprops.DIBChannels    = 3;
        jcprops.DIBColor       = IJL_BGR;
 
        jcprops.JPGWidth       = (int)(nWidth * fScale);
        jcprops.JPGHeight      = (int)(nHeight * fScale);
        jcprops.JPGFile        = NULL;
        jcprops.JPGBytes       = pJpgBuf;
        jcprops.JPGSizeBytes   = nJpgSize;
        jcprops.JPGChannels    = 3;
        jcprops.JPGColor       = IJL_YCBCR;
        jcprops.JPGSubsampling = IJL_411;       //4:1:1 subsampling.
        jcprops.jquality       = nQuality;      //Write the actual JPEG image from the pixel buffer.
 
        jerr = ijlWrite(&jcprops, IJL_JBUFF_WRITEWHOLEIMAGE);
        if (IJL_OK != jerr)
        {
            ("ijlWrite failed! jerr=%d\n", jerr);
            nRet = -1;
            break;
        }
 
        //JPG图像大小
        nJpgSize = jcprops.JPGSizeBytes;
        ("JPG Image Size=%d\n", nJpgSize);
    }while(FALSE);
 
    ijlFree(&jcprops);
    return nRet;// 

《二》JPEG解码成RGB24

// 获得JPEG图像的宽度高度
int IJL_JpgSize(BYTE *pJpgBuf, int nJpgSize, INT *pnWidth, INT *pnHeight)
{
    JPEG_CORE_PROPERTIES jcprops = {0};
    if (IJL_OK != ijlInit(&jcprops))
    {
		return FALSE;
    }

    IJLERR result        = IJL_OK;
    jcprops.JPGBytes     = pJpgBuf;
    jcprops.JPGSizeBytes = nJpgSize;
    result = ijlRead(&jcprops, IJL_JBUFF_READPARAMS);
    if (IJL_OK == result)
    {
		*pnWidth  = jcprops.JPGWidth;
        *pnHeight = jcprops.JPGHeight;
	}

	ijlFree(&jcprops);
	return (IJL_OK == result);
}

// 解码JPEG成RGB24
int IJL_JpgToRGB24(BYTE *pJpgBuf, int nJpgSize, BYTE *pBitmap, INT *pnWidth, INT *pnHeight)
{
    JPEG_CORE_PROPERTIES jcprops = {0};
    if (IJL_OK != ijlInit(&jcprops))
    {
		return FALSE;
    }

    IJLERR result        = IJL_OK;
    jcprops.JPGBytes     = pJpgBuf;
    jcprops.JPGSizeBytes = nJpgSize;
    if (IJL_OK == ijlRead(&jcprops, IJL_JBUFF_READPARAMS))
    {
        *pnWidth  = jcprops.JPGWidth;
        *pnHeight = jcprops.JPGHeight;
   
        jcprops.DIBBytes    = pBitmap;
        jcprops.DIBWidth    = *pnWidth;
        jcprops.DIBHeight   = *pnHeight;
        jcprops.DIBColor    = IJL_RGB;
        jcprops.DIBChannels = 3;
        result = ijlRead(&jcprops, IJL_JBUFF_READWHOLEIMAGE);
    }
    ijlFree(&jcprops);
    return (IJL_OK == result);
}




  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
下面是一个使用C语言和OpenSSL库编写RSA算法的示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <openssl/rsa.h> #include <openssl/pem.h> int main(void) { RSA *rsa = NULL; BIO *bio = NULL; char *pubkey = "-----BEGIN PUBLIC KEY-----\n\ MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA3SHxX3Qv3RrXn7WUuqE2\n\ 6fL6Nz7mTfjTgJZv5j4Jl9QyJZzJF9eQ3oLJHJG3cBfXWw1XH+df/g8pB3xhVJb7\n\ 4xTmTnGpQ5FezX8Wjh7ACs1xuMfDLG7/JJWvI1D4Y5mB9GZc82XbYJZ2vYBDCs0i\n\ fK8rlnP1n7k1Y0myY9tQ3rKv7lW9HJkLw3O7Xo0lJL1+3dCjJf8z7QaQ8SjvD7XZ\n\ 8ia5S2TJLmNi2bGKmRzGZnKJmQOqoe9sJZlUyOJyv/8fLmJQvZc9OJ5yv5BHJm3D\n\ bXAyNzdZ9QF4JW6ZzvRn9t+JQ1uXw8yCQ7KEv8kX8hxXg3Zj8o1sP3Vn7ZiEIN6V\n\ n2U5zvLZ0rN7tXrW1U3j4C8e3YJ0Df2KXyRqZDrm0ZlZz4L3h3JF7qWx3eQwVMtU\n\ fWV1PvoqJ2OQzILU1FJ3oVJ5d5PpRhXeKlD4Z0JvL8F2DY7Kjy+4mL3g1jX9W1JJ\n\ 2+8eW4w8z6Y+3WpL3n8kBuRRkS5hRv1Cw6dRQ9Q4dM7xKlJjU7W9C5H4K6c+YwCJ\n\ 9YApdJqR1Pz3YfJ2c5bM67Jc0n9zGdH5JZyyqoI6bKzqjpfC3ZcR5I7Q9pFJmzWu\n\ k5A0yy/4yxPnDw5txrNZtL1DemyKv4XUrC9VZl98y3KZyYK+7UgZb3Z6QZQu3IjL\n\ 3xj2tJz6GtDfX7J7H+2c4jECAwEAAQ==\n\ -----END PUBLIC KEY-----"; char *privkey = "-----BEGIN PRIVATE KEY-----\n\ MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDdIfFfdC/dGted\n\ +1lLqhNuny+jc+5k3484CZb+Y+CZfUMiWcyRfXkN6CyRyRt3AX11sNVx/nX/4PKQ\n\ f8YVSW++MU5k5xqUORXs1/Fo4ewArNcbjHwyxu/ySVryNQ+GOZgfRmXPNl22CWdr\n\ 9gEMKzSJ8ryuWc/WfuTVjSbJj21Desq/uVb0cmQvDc7tejSUkvX7d0KMl/zPtBpD\n\ xKO8PtdnyJrlLZMkuaNjZsYqZHMZmcomZA6qh72wlmVTI4nK//x8uYlC9lz04nnK\n\ /kEcmbcNtcDI3N1n1AXglbpnO9Gf234lDW5fDzIJDsoS/yRfyHFeDdmPyjWw/dWf\n\ tmIQg3pWfZTnO8tnSs3u1etbVTePgLx7dgnQN/YpfJGpkOubRmVnPgve

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值