socketref,再见!高德

https://github.com/adoggie

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  246 Posts :: 4 Stories :: 312 Comments :: 0 Trackbacks

常用链接

留言簿(54)

我参与的团队

搜索

  •  

最新评论

阅读排行榜

评论排行榜


  1 #include <stdio.h>
  2 
  3 #include "jpeglib.h"
  4 
  5 void
  6 JpegInitDestination(j_compress_ptr cinfo)
  7 {
  8 }
  9 
 10 static boolean
 11 JpegEmptyOutputBuffer(j_compress_ptr cinfo)
 12 {    
 13     return TRUE;
 14 }
 15 
 16 static void
 17 JpegTermDestination(j_compress_ptr cinfo)
 18 {
 19 //    jpegDstDataLen = jpegDstBufferLen - jpegDstManager.free_in_buffer;
 20 }
 21 
 22 /**
 23     Raw Rgb Data converted to Jpeg data
 24 */
 25 bool JpegCompress(int w,int h,const char * rgb_data,int rgb_size,
 26                   char * jpeg_data,int *jpeg_size){
 27     struct jpeg_compress_struct cinfo;
 28     struct jpeg_error_mgr jerr;
 29     struct jpeg_destination_mgr jpegDstManager;
 30     int ret;
 31     unsigned char *srcBuf = new unsigned char[w * 3];
 32     JSAMPROW rowPointer[1];
 33     rowPointer[0= (JSAMPROW)srcBuf;
 34     int left_size;
 35     left_size = *jpeg_size;
 36     cinfo.err = jpeg_std_error(&jerr);
 37     jpeg_create_compress(&cinfo);
 38 
 39     cinfo.image_width = w;
 40     cinfo.image_height = h;
 41     cinfo.input_components = 3;
 42     cinfo.in_color_space = JCS_RGB;
 43     cinfo.raw_data_in = true;
 44     jpeg_set_defaults(&cinfo);
 45     
 46     
 47     cinfo.dest = &jpegDstManager;
 48     
 49     jpegDstManager.next_output_byte = (unsigned char*)jpeg_data;
 50     jpegDstManager.free_in_buffer = left_size;
 51     jpegDstManager.init_destination = JpegInitDestination;
 52     jpegDstManager.empty_output_buffer = JpegEmptyOutputBuffer;
 53     jpegDstManager.term_destination = JpegTermDestination;
 54         
 55     //jpeg_set_quality(&cinfo, 20, TRUE);
 56     
 57     jpeg_start_compress(&cinfo, TRUE);    
 58     for(int y=0;y< h;y++){
 59         rowPointer[0= (unsigned char*)(rgb_data + y*w*3);
 60         ret = jpeg_write_scanlines(&cinfo, rowPointer, 1);
 61     }
 62     jpeg_finish_compress(&cinfo);    
 63     jpeg_destroy_compress(&cinfo);    
 64     *jpeg_size = left_size - jpegDstManager.free_in_buffer;
 65     return true;
 66 }
 67 
 68 void
 69 JpegInitSource(j_decompress_ptr cinfo)
 70 {
 71 
 72 }
 73 
 74 boolean
 75 JpegFillInputBuffer(j_decompress_ptr cinfo)
 76 {
 77     /*
 78     jpegError = true;
 79     jpegSrcManager.bytes_in_buffer = jpegBufferLen;
 80     jpegSrcManager.next_input_byte = (JOCTET *)jpegBufferPtr;    */
 81     return TRUE;
 82 }
 83 
 84 void
 85 JpegSkipInputData(j_decompress_ptr cinfo, long num_bytes)
 86 {/*
 87     if (num_bytes < 0 || (size_t)num_bytes > jpegSrcManager.bytes_in_buffer) {
 88         jpegError = true;
 89         jpegSrcManager.bytes_in_buffer = jpegBufferLen;
 90         jpegSrcManager.next_input_byte = (JOCTET *)jpegBufferPtr;
 91     } else {
 92         jpegSrcManager.next_input_byte += (size_t) num_bytes;
 93         jpegSrcManager.bytes_in_buffer -= (size_t) num_bytes;
 94     }*/
 95 }
 96 
 97 void
 98 JpegTermSource(j_decompress_ptr cinfo)
 99 {
100     /* No work necessary here. */
101 }
102 
103 bool JpegUnCompress(const char * jpeg_data,int jpeg_size,
104                     char *rgb_data,int rgb_size,int w,int h){
105     struct jpeg_decompress_struct cinfo;
106     struct jpeg_error_mgr jerr;
107     struct jpeg_source_mgr jpegSrcManager;
108     int ret;
109     JSAMPROW rowPointer[1];
110     cinfo.err = jpeg_std_error(&jerr);
111     jpeg_create_decompress(&cinfo);
112 
113     jpegSrcManager.init_source = JpegInitSource;
114     jpegSrcManager.fill_input_buffer = JpegFillInputBuffer;
115     jpegSrcManager.skip_input_data = JpegSkipInputData;
116     jpegSrcManager.resync_to_restart = jpeg_resync_to_restart;
117     jpegSrcManager.term_source = JpegTermSource;
118     jpegSrcManager.next_input_byte = (unsigned char*)jpeg_data;
119     jpegSrcManager.bytes_in_buffer = jpeg_size;
120     cinfo.src = &jpegSrcManager;
121     
122     jpeg_read_header(&cinfo, TRUE);
123     cinfo.out_color_space = JCS_RGB;
124     jpeg_start_decompress(&cinfo);
125     if( cinfo.output_width != (unsigned int)w && cinfo.output_height != (unsigned int)h){
126         jpeg_destroy_decompress(&cinfo);
127         return false;
128     }
129     for (int dy = 0; cinfo.output_scanline < cinfo.output_height; dy++) {
130         rowPointer[0= (unsigned char *)(rgb_data + w*dy*3);
131         ret = jpeg_read_scanlines(&cinfo, rowPointer, 1);
132     }
133     jpeg_finish_decompress(&cinfo);        
134     jpeg_destroy_decompress(&cinfo);        
135     return true;
136 }
137 
posted on 2006-03-02 00:47 放屁阿狗 阅读(8400) 评论(9)  编辑 收藏 引用 所属分类: 视频监控

Feedback

# re: 如何使用libjpeg(rgb2jpeg) 2006-03-08 15:08 shi
good

  回复  更多评论
  

# re: 如何使用libjpeg(rgb2jpeg) 2006-03-10 16:12 binger
请教:bool JpegUnCompress(const char * jpeg_data,int jpeg_size, char *rgb_data,int rgb_size,int w,int h)函数中 jpeg_size和rgb_size参数是什么意思?
是rgb和jpeg文件的尺寸吗?rgb文件可以知道,但是jpeg文件在压缩前是怎么知道大小的呢?  回复  更多评论
  

# re: 如何使用libjpeg(rgb2jpeg) 2006-03-10 17:09 binger
作者编译过这段代码吗?我怎么编译的时候有好多错误,请指教  回复  更多评论
  

# re: 如何使用libjpeg(rgb2jpeg) 2006-03-10 22:41 Guest
请作者指教:用libjpeg可以去得到DCT变换后或量化变换后的数据吗?如果可以请指教!  回复  更多评论
  

# re: 如何使用libjpeg(rgb2jpeg) 2006-03-20 13:38 dibotiger
使用ultravnc-101-src带的libjpeg.

把编译好的Realse LIB和3个必须的头文件拷入我的工程目录。

把你写的这个文件做以下修改

#include <stdio.h>
extern "C"{
#include "jpeglib.h"
}

其他不变,编译链接通过。

但是在程序运行的时候,发现程序一调用JpegCompress函数就自动退出。

调试逐步运行,发现在jpeg_create_compress这个地方退出。WHY?

期望得到你的帮助。  回复  更多评论
  

# re: 如何使用libjpeg(rgb2jpeg) 2006-05-10 20:01 benjaminwan
你这个是不是只能压缩RGB24(即24位色)格式的图像数据,不能压缩RGB565(即16位色)图像格式?
想知道如何压缩RGB565格式的图像数据  回复  更多评论
  

# re: 如何使用libjpeg(rgb2jpeg) 2006-05-22 14:08 么么
是啊 我用JpegLib这个库的时候 jpeg_create_compress以后 总是返回false这是怎么回事儿啊????请教!!
  回复  更多评论
  

# re: 如何使用libjpeg(rgb2jpeg) 2006-06-24 10:12 zhou533
请问31行创建的srcBuf的作用什么?  回复  更多评论
  

# re: 如何使用libjpeg(rgb2jpeg) 2009-07-25 16:48 liuz
要自定义一个错误对象,如:
struct my_error_mgr {
struct jpeg_error_mgr pub; // "public" fields

jmp_buf setjmp_buffer; // for return to caller

};

typedef struct my_error_mgr *my_error_ptr;


METHODDEF(void) my_error_exit (j_common_ptr cinfo)
{
// cinfo->err really points to a my_error_mgr struct, so coerce pointer

my_error_ptr myerr = (my_error_ptr) cinfo->err;

// Return control to the setjmp point

longjmp(myerr->setjmp_buffer, 1);
}

然后设置错误对象:
cinfo.err = jpeg_std_error(&jerr.pub);
jerr.pub.error_exit = my_error_exit;
/* Establish the setjmp return context for my_error_exit to use. */
if (setjmp(jerr.setjmp_buffer)) {
/* If we get here, the JPEG code has signaled an error.
* We need to clean up the JPEG object, close the input file, and return.
*/
jpeg_destroy_decompress(&cinfo);
fclose(infile);
return 0;
}
  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理