使用libjpeg 压缩yuv420到jpg (内存方式)
#include <Windows.h>
#include <stdio.h>
extern "C" {
#include <jpeglib.h>
}
#define WIDTH 352
#define HEIGHT 288
#define QUALITY 80
#define BUFFER_SZIE (WIDTH*HEIGHT*2)
/* The following declarations and 5 functions are jpeg related
* functions used by put_jpeg_grey_memory and put_jpeg_yuv420p_memory
*/
typedef struct {
struct jpeg_destination_mgr pub;
JOCTET *buf;
size_t bufsize;
size_t jpegsize;
} mem_destination_mgr;
typedef mem_destination_mgr *mem_dest_ptr;
METHODDEF(void) init_destination(j_compress_ptr cinfo)
{
mem_dest_ptr dest = (mem_dest_ptr) cinfo->dest;
dest->pub.next_output_byte = dest->buf;
dest->pub.free_in_buffer = dest->bufsize;
dest->jpegsize = ;
}
METHODDEF(boolean) empty_output_buffer(j_compress_ptr cinfo)
{
mem_dest_ptr dest = (mem_dest_ptr) cinfo->dest;
dest->pub.next_output_byte = dest->buf;
dest->pub.free_in_buffer = dest->bufsize;
return FALSE;
}
METHODDEF(void) term_destination(j_compress_ptr cinfo)
{
mem_dest_ptr dest = (mem_dest_ptr) cinfo->dest;
dest->jpegsize = dest->bufsize - dest->pub.free_in_buffer;
}
static GLOBAL(void) jpeg_mem_dest(j_compress_ptr cinfo, JOCTET* buf, size_t bufsize)
{
mem_dest_ptr dest;
if (cinfo->dest == NULL) {
cinfo->dest = (struct jpeg_destination_mgr *)
(*cinfo->mem->alloc_small)((j_common_ptr)cinfo, JPOOL_PERMANENT,
sizeof(mem_destination_mgr));
}
dest = (mem_dest_ptr) cinfo->dest;
dest->pub.init_destination = init_destination;
dest->pub.empty_output_buffer = empty_output_buffer;
dest->pub.term_destination = term_destination;
dest->buf = buf;
dest->bufsize = bufsize;
dest->jpegsize = ;
}
static GLOBAL(int) jpeg_mem_size(j_compress_ptr cinfo)
{
mem_dest_ptr dest = (mem_dest_ptr) cinfo->dest;
return dest->jpegsize;
}
/* put_jpeg_yuv420p_memory converts an input image in the YUV420P format into a jpeg image and puts
* it in a memory buffer.
* Inputs:
* - input_image is the image in YUV420P format.
* - width and height are the dimensions of the image
* Output:
* - dest_image is a pointer to the jpeg image buffer
* Returns buffer size of jpeg image
*/
static int put_jpeg_yuv420p_memory(unsigned char *dest_image,
unsigned char *input_image, int width, int height)
{
int i, j, jpeg_image_size;
JSAMPROW y[],cb[],cr[]; // y[2][5] = color sample of row 2 and pixel column 5; (one plane)
JSAMPARRAY data[]; // t[0][2][5] = color sample 0 of row 2 and column 5
struct jpeg_compress_struct cinfo;
struct jpeg_error_mgr jerr;
data[] = y;
data[] = cb;
data[] = cr;
cinfo.err = jpeg_std_error(&jerr); // errors get written to stderr
jpeg_create_compress(&cinfo);
cinfo.image_width = width;
cinfo.image_height = height;
cinfo.input_components = ;
jpeg_set_defaults (&cinfo);
jpeg_set_colorspace(&cinfo, JCS_YCbCr);
cinfo.raw_data_in = TRUE; // supply downsampled data
cinfo.do_fancy_downsampling = FALSE; // fix segfaulst with v7
cinfo.comp_info[].h_samp_factor = ;
cinfo.comp_info[].v_samp_factor = ;
cinfo.comp_info[].h_samp_factor = ;
cinfo.comp_info[].v_samp_factor = ;
cinfo.comp_info[].h_samp_factor = ;
cinfo.comp_info[].v_samp_factor = ;
jpeg_set_quality(&cinfo, QUALITY, TRUE);
cinfo.dct_method = JDCT_FASTEST;
jpeg_mem_dest(&cinfo, dest_image, BUFFER_SZIE); // data written to mem
jpeg_start_compress (&cinfo, TRUE);
; j < height; j += ) {
; i < ; i++) {
y[i] = input_image + width * (i + j);
== ) {
cb[i/] = input_image + width * height + width / * ((i + j) / );
cr[i/] = input_image + width * height + width * height / + width / * ((i + j) / );
}
}
jpeg_write_raw_data(&cinfo, data, );
}
jpeg_finish_compress(&cinfo);
jpeg_image_size = jpeg_mem_size(&cinfo);
jpeg_destroy_compress(&cinfo);
return jpeg_image_size;
}
int main( int argc, TCHAR * argv[], TCHAR * envp[] )
{
HANDLE fyuv,fyuvjpg;
BYTE *pSrc ,*pDst;
LONG lSize = ;
DWORD readsize;
DWORD writesize;
pSrc = new BYTE[BUFFER_SZIE];
fyuv = CreateFile(L, NULL, OPEN_EXISTING, , NULL);
ReadFile(fyuv , pSrc ,BUFFER_SZIE ,&readsize,NULL);
pDst = new BYTE[BUFFER_SZIE];
lSize = put_jpeg_yuv420p_memory(pDst,pSrc , WIDTH ,HEIGHT);
fyuvjpg = CreateFile(L, NULL, CREATE_ALWAYS, , NULL);
WriteFile(fyuvjpg, pDst, lSize, &writesize, NULL);
CloseHandle(fyuv);
CloseHandle(fyuvjpg);
;
}
使用libjpeg 压缩yuv420到jpg (内存方式)的更多相关文章
- C语言中的联合体union所占内存方式
当多个数据需要共享内存或者多个数据每次只取其一时,可以利用联合体(union).在C Programming Language 一书中对于联合体是这么描述的: 1)联合体是一个结构: ...
- 史林枫:sqlserver数据库中数据日志的压缩及sqlserver占用内存管理设置
使用sqlserver和IIS开发.net B/S程序时,数据量逐渐增多,用户也逐渐增多,那么服务器的稳定性就需要维护了.数据库如何占用更小内存,无用的日志如何瞬间清空? 今天在给一个客户维护网站的时 ...
- CxImage内存方式转换图像
最近,处于项目需要,需要将Bmp转换为JPEG格式.以前做过,采用的是GDI+的方式,该方式有一个极大地缺陷为无法实现跨平台处理.闲话少说,进入正题. CxImage cxImageBmp(pRGBB ...
- AFNetworking上传一张或多张图片,并压缩图片节约占用内存
最近在做APP的时候,遇到了难题:根据公司需求,在用户评论并上传图片的时候,有的手机像素比较高拍的照片高清的,但是每张图片占用的内存太大,或者上传照片的时候,相册的部分照片本身就占很大内存空间,后台数 ...
- .net中清理内存,清理占用内存方式方法
#region 内存回收 [DllImport("kernel32.dll", EntryPoint = "SetProcessWorkingSetSize") ...
- SAP SMARTFORMS-基于内存方式在report程序中传递数据到smartforms显示
一.准备工作 1.新建include程序 1> include程序名字:ZDD_INC_0104 2> ZDD_INC_0104 程序中的内容为 2.使用T-CODE :SE11新建两个 ...
- Eclipse中设置JDK内存方式
(1) 打开Eclipse,双击Serveers进入到servers编辑画面 (2) 点击 Open launch configuration 选项 (3) 选项中找到Arguments 的选项卡(t ...
- 008-对象—— 对象$this self parent 内存方式及使用方法讲解
<?php /** * */ /*class Web{ private $webname; private $weburl; function __construct($webname,$web ...
- <转>libjpeg解码内存中的jpeg数据
转自http://my.unix-center.net/~Simon_fu/?p=565 熟悉libjpeg的朋友都知道libjpeg是一个开源的库.Linux和Android都是用libjpeg来 ...
随机推荐
- SRM 212 Div II Level One: YahtzeeScore
题目来源:http://community.topcoder.com/stat?c=problem_statement&pm=1692&rd=5858 比较简单. 代码如下: #inc ...
- go语言基础之普通函数的调用流程
函数调用流程:先调用后返回,先进后出,函数递归,函数调用自己本分,利用此物点 1.普通函数的调用流程 package main //必须 import "fmt" func fun ...
- (转)实现AI中LOD优化技术
LOD(Level Of Detail)是3D渲染中用到的概念,按照wikipedia上的翻译,可以译为“细节层次”,它是一种根据与观察点的距离,来减低物体或者模型的复杂度来提升渲染效率的优化技术,因 ...
- Myeclipse最全快捷键
转自:http://www.iteye.com/topic/1051317 Ctrl+1 快速修复(最经典的快捷键,就不用多说了) Ctrl+D: 删除当前行 Ctrl+Alt+↓ 复制当前行到下一 ...
- (算法)Hanoi Problem汉诺塔问题
Problem: There are three poles and N disks where each disk is heaver than the next disk. In the init ...
- 推送未找到应用程序的“aps-environment”的权利字符串错误
一:使用百度推送,或是苹果自带的推送出,才配置好anps-cer文件之后,出现错误 推送未找到应用程序的“aps-environment”的权利字符串错误 二:错误原因: 此原因是配置好推送证书之后, ...
- dsPIC33EP 时钟初始化程序
//文件名p33clk.h #ifndef _P33CLK_H_ #define _P33CLK_H_ //#include "p33clk.h" #define WDT_ENB ...
- B/S学习总结
经过5个月的学习,B/S学习的项目完毕了. 尽管项目完毕了,可是感觉自己还是差非常远.会的太少了.须要在项目中不断实战吧.以下分别对每一个项目进行总结. 牛腩新闻公布系统 简单介绍: 跟着视频里面的牛 ...
- TP框架项目部署linux大小写问题
TP框架项目部署linux大小写问题
- C++(一)——HelloWorld
之前学C.学Python,学的比較多的是Java,作为大家口中更强大的C++,要学学,这次的话,以了解主要的特性和做个小游戏作为目标吧. 1)HelloWorld Eclipse执行C++之Launc ...