#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 (内存方式)的更多相关文章

  1. C语言中的联合体union所占内存方式

     当多个数据需要共享内存或者多个数据每次只取其一时,可以利用联合体(union).在C Programming Language 一书中对于联合体是这么描述的:      1)联合体是一个结构:    ...

  2. 史林枫:sqlserver数据库中数据日志的压缩及sqlserver占用内存管理设置

    使用sqlserver和IIS开发.net B/S程序时,数据量逐渐增多,用户也逐渐增多,那么服务器的稳定性就需要维护了.数据库如何占用更小内存,无用的日志如何瞬间清空? 今天在给一个客户维护网站的时 ...

  3. CxImage内存方式转换图像

    最近,处于项目需要,需要将Bmp转换为JPEG格式.以前做过,采用的是GDI+的方式,该方式有一个极大地缺陷为无法实现跨平台处理.闲话少说,进入正题. CxImage cxImageBmp(pRGBB ...

  4. AFNetworking上传一张或多张图片,并压缩图片节约占用内存

    最近在做APP的时候,遇到了难题:根据公司需求,在用户评论并上传图片的时候,有的手机像素比较高拍的照片高清的,但是每张图片占用的内存太大,或者上传照片的时候,相册的部分照片本身就占很大内存空间,后台数 ...

  5. .net中清理内存,清理占用内存方式方法

    #region 内存回收 [DllImport("kernel32.dll", EntryPoint = "SetProcessWorkingSetSize") ...

  6. SAP SMARTFORMS-基于内存方式在report程序中传递数据到smartforms显示

    一.准备工作 1.新建include程序 1> include程序名字:ZDD_INC_0104 2> ZDD_INC_0104  程序中的内容为 2.使用T-CODE :SE11新建两个 ...

  7. Eclipse中设置JDK内存方式

    (1) 打开Eclipse,双击Serveers进入到servers编辑画面 (2) 点击 Open launch configuration 选项 (3) 选项中找到Arguments 的选项卡(t ...

  8. 008-对象—— 对象$this self parent 内存方式及使用方法讲解

    <?php /** * */ /*class Web{ private $webname; private $weburl; function __construct($webname,$web ...

  9. <转>libjpeg解码内存中的jpeg数据

    转自http://my.unix-center.net/~Simon_fu/?p=565 熟悉libjpeg的朋友都知道libjpeg是一个开源的库.Linux和Android都是用libjpeg来 ...

随机推荐

  1. Item 5:那些被C++默默地声明和调用的函数 Effective C++笔记

    Item 5: Know what functions C++ silently writes and calls 在C++中,编译器会自己主动生成一些你没有显式定义的函数,它们包含:构造函数.析构函 ...

  2. Linux 网络设备驱动开发(一) —— linux内核网络分层结构

    Preface Linux内核对网络驱动程序使用统一的接口,并且对于网络设备采用面向对象的思想设计. Linux内核采用分层结构处理网络数据包.分层结构与网络协议的结构匹配,既能简化数据包处理流程,又 ...

  3. 自定义控件 淘宝头条【ViewFlipper】

    简易版 代码 ); tv.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Acti ...

  4. Fragment 创建 传递参数 跳转【典例】

    Fragment一定要有一个无参的构造方法! 因为当Activity因屏幕旋转或者因内存不足被系统杀死时,会导致Activity被重新创建,而当Activity被重建时,FragmentManager ...

  5. HTML5-IOS WEB APP应用程序(IOS META)

    触摸屏网站的开发其实现在来讲比前几年移动端网站开发好多了,触摸屏设备IOS.Android.BBOS6等系统自带浏览器均为WEBKIT核心,这就说明PC上面尚未立行的HTML5 CSS3能够运用在这里 ...

  6. 利用MyEclipse开发一个调用webservice接口的程序

    上一篇文章我们已经学习了如何使用Java 工具MyEclipse开发一个webservice接口,那么接口开发好了如何调用?接下来我们就来解决这个问题. 1:首先随便创建一个Java project选 ...

  7. Python+Django+SAE系列教程13-----MySQL记录的添\删\改

    建立了数据库后,我们就来做一个简单的表(person_classroom)的加入.删除.改动的操作. 首先我们建立一个加入的页面的模板Classroom_Add.html(加入的表单)并把它放在Bid ...

  8. [Functional Programming] Capture Side Effects in a Task / Async

    We examine the data structure Task, see some constructors, familiar methods, and finally how it capt ...

  9. linux下vim命令具体解释

    很具体的介绍linux中vim的操作命令. 高级一些的编辑器,都会包括宏功能,vim当然不能缺少了.在vim中使用宏是很方便的: :qx     開始记录宏.并将结果存入寄存器x q     退出记录 ...

  10. Python中的作用域

    Python中的作用域 Python 中,一个变量的作用域总是由在代码中被赋值的地方所决定的. 当 Python 遇到一个变量的话他会按照这样的顺序进行搜索: 本地作用域(Local)→当前作用域被嵌 ...