如何让压缩包内存将Jdp的内存压缩

jdpzby 总计&:&4061元
配置类型:
浏览数:383
复制此表格
总计&:&¥4061元
热门配置排行
最受关注电脑配置排行
投票最多电脑配置排行
装机硬件报价
(458)(332)(1223)(1089)(189)(1615)(1484)(1574)(1324)(899)(2460)(2570)(2629)(564)(7243)
元配置排行
经济实惠型配置排行
热门硬件资讯
网友首选显卡(本月选用最多)
选用1487次
网友首选主板(本月选用最多)
选用2294次
选用1386次
选用1148次
选用1003次
网友首选机箱(本月选用最多)
选用1655次
选用1198次
选用1175次
论坛经验+20Z金豆+5我的电脑是256M内存的,太小了。我想再插一条,应该怎么做啊?_百度知道
我的电脑是256M内存的,太小了。我想再插一条,应该怎么做啊?
内存太小。电脑速度很慢。如果我再插一条同样型号的内存。速度会提高么?插上了要不要重装系统啊?
我有更好的答案
1、你是什么牌子电脑?型号?可以查出用什么内存。2、拔下内存,买同一型号大容量的,插上去就可以了。速度会提高不少!不要重装系统的。
采纳率:29%
看你是啥配置哈。。。如果你用的是P3时代的CPU。那很抱歉的告诉您。再加内存也没啥用处了。如果是早期P4时代的CPU。估计您用的应该是P4时代的早期CPU。也就那时候的电脑才出来就是256MB内存。可以插条512MB或者1GB的。不过您要打售后咨询下您的主板是否支持1GB的内存。早期P4主板很多不支持1GB内存,只能扫出最大单条512MB。还有内存频率要问清楚,尽量买相同频率的内存
的确是小。加内存要看你的内存是几代的。现在内存有DDR1 DDR2 DD3 。3代了。 正常运行Windows XP 内存最起码要512MB 以上的。型号对好直接插上就好了。其他没什么影响的。
速度会提高(肯定会,但是不明显,显然512M内存还是不够大),另外来一点,插上了当然不要重装,说明一下操作系统是一个软件,你换的是硬件。再来一点,电脑速度很慢不仅仅是内存的问题,更重要的是在如今软件众多的情况下……CPU,不搞个双核,就连XP系统都无可奈何了,起码两个加起来要到3GHZ最好了。
可以再插上一条,速度会有明显提高,如果插上后系统不稳定可以把那条旧的拆下来,我用的就是1GB DDR2 667和2GB DDR2 800的组合,系统很稳定,插上以后不用重装系统。
不用重装系统,直接把同型号的内存插在内存槽上即可。
其他7条回答
为您推荐:
其他类似问题
您可能关注的内容
内存的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。libjpeg实现内存内位图的压缩及解压缩_百度文库
您的浏览器Javascript被禁用,需开启后体验完整功能,
享专业文档下载特权
&赠共享文档下载特权
&10W篇文档免费专享
&每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
libjpeg实现内存内位图的压缩及解压缩
&&libjpeg实现内存内位图的压缩及解压缩
阅读已结束,下载本文需要
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,同时保存到云知识,更方便管理
加入VIP
还剩4页未读,
定制HR最喜欢的简历
你可能喜欢remind me of my sweat
通过简单修改libjpeg源代码,实现内存内位图的压缩及解压缩
相信使用过的朋友应该会喜欢上libjpeg,它简单易用、压缩质量可以随意控制、并且稳定性很好,但是,官方网站给提供的libjpeg库,
不论是进行压缩时还是解压缩时,都需要用到FILE,使得我们如果想在内存中直接压缩或解压缩图像还要自己实现相应的结构,
总之,比较麻烦,尤其对初学者,更是不知从何处入手,幸运的是,libjpeg给我们提供了源代码,今天我就为大家介绍,怎样修改源代码,
使libjpeg可以非常容易的直接处理内存中的图像,而无需借助文件操作。
一、建立自己的libjpeg工程
为了修改后编译方便,也为了以后在VC 环境下容易使用libjpeg库,我们按以下步骤将libjpeg转换为VC环境下的工程。
1、在VC环境下重新建立一个空的static library工程,工程名为libjpeg,此处注意,新建工程不要包含mfc,不要预编译头文件;
2、然后将libjpeg下的jcapimin.c jcapistd.c jccoefct.c jccolor.c jcdctmgr.c jchuff.c
jcinit.c jcmainct.c jcmarker.c jcmaster.c jcomapi.c jcparam.c
jcphuff.c jcprepct.c jcsample.c jctrans.c jdapimin.c jdapistd.c
jdatadst.c jdatasrc.c jdcoefct.c jdcolor.c jddctmgr.c jdhuff.c
jdinput.c jdmainct.c jdmarker.c jdmaster.c jdmerge.c jdphuff.c
jdpostct.c jdsample.c jdtrans.c jerror.c jfdctflt.c jfdctfst.c
jfdctint.c jidctflt.c jidctfst.c jidctint.c jidctred.c jquant1.c
jquant2.c jutils.c jmemmgr.c
jconfig.h jdhuff.h jdct.h jerror.h jinclude.h jmemsys.h jmorecfg.h
jpegint.h jpeglib.h jversion.h 等文件拷贝到新工程的文件夹下,并将.c文件改名为.cpp;
3、将所有的源文件及头文件添加到新建的工程中;
4、编译新工程,此时就可以生成libjpeg.lib了。
二、分析并修改源代码
我们知道,libjpeg是利用FILE进行存取图像数据的,接下来,我们就要分析一下libjpeg是怎样利用FILE进行存取图像数据的,
然后我们用内存拷贝的方式替换掉所有的文件操作(I/O),也就实现了内存中进行图像压缩和解压缩的目标。
下面,先分析压缩图像时libjpeg是怎样利用FILE进行存储数据的。我们先看在进行图像压缩时,我们所调用的跟文件有关系的函数:
jpeg_stdio_dest(j_compres_ptr cinfo, FILE *outfile);
我们找到这个函数的源代码(jdatadst.cpp文件第130行):
GLOBAL(void)
jpeg_stdio_dest (j_compress_ptr cinfo, FILE * outfile)
/* The destination object is made permanent so that multiple JPEG images
* can be written to the same file without re-executing jpeg_stdio_dest.
* This makes it dangerous to use this manager and a different destination
* manager serially with the same JPEG object, because their private object
* sizes may be different.
Caveat programmer.
if (cinfo-&dest == NULL) { /* first time for this JPEG object? */
cinfo-&dest = (struct jpeg_destination_mgr *)
(*cinfo-&mem-&alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
SIZEOF(my_destination_mgr));
dest = (my_dest_ptr) cinfo-&
dest-&pub.init_destination = init_
dest-&pub.empty_output_buffer = empty_output_
dest-&pub.term_destination = term_
dest-&outfile =
大家看第20行,函数将FILE类型的指针赋值给了dest-&outfile,很显然,以后对文件的操作,就转向了对dest-&outfile 的操作,
我们只要找到所有引用outfile的函数,就可以知道libjpeg是怎样压缩图像到文件的,因此,我们继续搜outfile,搜索结果如下:
Find all "outfile", Subfolders, Find Results 1, "Entire Solution"
E:/VS2005/libjpeg/libjpeg/jpeglib.h(910):EXTERN(void) jpeg_stdio_dest JPP((j_compress_ptr cinfo, FILE * outfile));
E:/VS2005/libjpeg/libjpeg/jdatadst.cpp(28):
/* target stream */
E:/VS2005/libjpeg/libjpeg/jdatadst.cpp(85):
if (JFWRITE(dest-&outfile, dest-&buffer, OUTPUT_BUF_SIZE) !=
E:/VS2005/libjpeg/libjpeg/jdatadst.cpp(113):
if (JFWRITE(dest-&outfile, dest-&buffer, datacount) != datacount)
E:/VS2005/libjpeg/libjpeg/jdatadst.cpp(116):
fflush(dest-&outfile);
E:/VS2005/libjpeg/libjpeg/jdatadst.cpp(118):
if (ferror(dest-&outfile))
E:/VS2005/libjpeg/libjpeg/jdatadst.cpp(130):jpeg_stdio_dest (j_compress_ptr cinfo, FILE * outfile)
E:/VS2005/libjpeg/libjpeg/jdatadst.cpp(150):
dest-&outfile =
Matching lines: 8
Matching files: 2
Total files searched: 57
可以看到,共有8处引用了outfile变量,第一处为函数声明,第二处为变量声明,第三、四、五、六处为文件操作,第七处和第八处我们
已经见过了,我们只需要把这八处改了就可以实现我们的目标了。如下:
EXTERN(void) jpeg_stdio_dest JPP((j_compress_ptr cinfo, char* outdata)); // 由EXTERN(void) jpeg_stdio_dest JPP((j_compress_ptr cinfo, FILE * outfile));改写
/* target stream */ // 由 FILE *
/* target stream */改写
jdatadst.cpp文件第87行empty_output_buffer (j_compress_ptr cinfo)函数
memcpy(dest-&outdata,dest-&buffer,OUTPUT_BUF_SIZE);// 由JFWRITE(dest-&outfile, dest-&buffer, OUTPUT_BUF_SIZE)改写
jdatadst.cpp文件第114行term_destination (j_compress_ptr cinfo)
memcpy(dest-&outdata,dest-&buffer,datacount);
// 由JFWRITE(dest-&outfile, dest-&buffer, datacount)改写
删除fflush(dest-&outfile);和if (ferror(dest-&outfile))及相关的其它语句。
peg_stdio_dest (j_compress_ptr cinfo, char* outdata)
// 由peg_stdio_dest (j_compress_ptr cinfo, FILE * outfile)改写
dest-&outdata =
// 由dest-&outfile =改写
我们改到这里,可以编译一下,应该不会有错误产生,但是,你会不会觉得有问题呢?对,我们发现,我们没有为内存区域提供偏移量(每次追加图像数据后,偏移量指向当前的位置),
另外,由于只有到压缩完才能知道图像压缩完后的数据量大小,我们还需要一个指示图像数据大小的变量。
我们将这两个变量添加到outdata后面,跟outdata一样,作为dest的成员变量,如下:
typedef struct {
struct jpeg_destination_ /* public fields */
/* target stream */
// 新加变量,该指针为调用者提供,压缩完后返回图像大小
// 新加变量
/* start of buffer */
} my_destination_
我们将通过jpeg_stdio_dest函数提供pSize指针,并在jpeg_stdio_dest的实现函数里对新添加的变量进行初始化,如下:
GLOBAL(void)
jpeg_stdio_dest (j_compress_ptr cinfo, char * outdata, int *pSize)
/* The destination object is made permanent so that multiple JPEG images
* can be written to the same file without re-executing jpeg_stdio_dest.
* This makes it dangerous to use this manager and a different destination
* manager serially with the same JPEG object, because their private object
* sizes may be different.
Caveat programmer.
if (cinfo-&dest == NULL) { /* first time for this JPEG object? */
cinfo-&dest = (struct jpeg_destination_mgr *)
(*cinfo-&mem-&alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
SIZEOF(my_destination_mgr));
dest = (my_dest_ptr) cinfo-&
dest-&pub.init_destination = init_
dest-&pub.empty_output_buffer = empty_output_
dest-&pub.term_destination = term_
/* 修改过的代码 */
dest-&outdata =
dest-&nOutOffset = 0;
dest-&pSize = pS
*(dest-&pSize)= 0;
改写声明函数
EXTERN(void) jpeg_stdio_dest JPP((j_compress_ptr cinfo, char* outdata, int *pSize));
jdatadst.cpp文件第87行empty_output_buffer (j_compress_ptr cinfo)函数
memcpy(dest-&outdata+dest-&nOutOffset,dest-&buffer,OUTPUT_BUF_SIZE);// 由JFWRITE(dest-&outfile, dest-&buffer, OUTPUT_BUF_SIZE)改写
dest-&nOutOffset+=OUTPUT_BUF_SIZE;
*(dest-&pSize)=dest-&nOutO
jdatadst.cpp文件第114行term_destination (j_compress_ptr cinfo)
memcpy(dest-&outdata+dest-&nOutOffset,dest-&buffer,datacount);
// 由JFWRITE(dest-&outfile, dest-&buffer, datacount)改写
dest-&nOutOffset+=
*(dest-&pSize)=dest-&nOutO
重新编译工程,这样我们就实现了压缩bmp位图到内存中,当然,调用jpeg_stdio_dest之前,我们需要先分配足够的内存,并把内存指针传递给jpeg_stdio_dest函数,
好了,我们再分析libjpeg在解压缩jpg图像时,是怎样从jpg文件读入图像数据的。
我们先看我们在解压缩图像时调用的与文件操作有关的函数,如下:
jpeg_stdio_src (j_decompress_ptr cinfo, FILE * infile)。
在该函数的实现代码中找到了my_src_ptr结构,并且,我们发现与文件操作有关的该结构的成员变量为infile,参考上面内容,我们搜索infile,搜索结果如下:
Find all "infile", Subfolders, Find Results 1, "Entire Solution"
E:/VS2005/libjpeg/libjpeg/jpeglib.h(911):EXTERN(void) jpeg_stdio_src JPP((j_decompress_ptr cinfo, FILE * infile));
E:/VS2005/libjpeg/libjpeg/jdatasrc.cpp(28):
/* source stream */
E:/VS2005/libjpeg/libjpeg/jdatasrc.cpp(95):
nbytes = JFREAD(src-&infile, src-&buffer, INPUT_BUF_SIZE);
E:/VS2005/libjpeg/libjpeg/jdatasrc.cpp(182):jpeg_stdio_src (j_decompress_ptr cinfo, FILE * infile)
E:/VS2005/libjpeg/libjpeg/jdatasrc.cpp(209):
src-&infile =
Matching lines: 5
Matching files: 2
Total files searched: 57
根据上面的经验,我们考虑,除了将FILE *类型变量改为char *类型的变量外,还要添加两个变量,图像大小的变量及图像偏移量,这跟图像压缩时差不多,所不同的是,
图像压缩时,图像大小是由libjpeg库返回,所以在调用是提供给libjpeg库的是个指针,而在解压缩时,图像数据大小是由调用者通过变量(不是指针)提供给libjpeg库。
由于我详细讲解了图像压缩时的我们所做的工作,我想读者朋友们很容易就能理解解压缩时所做的更改,下面我只列出我们所改写的代码,就不再详细讲解了。
jpeglib.h 第911行
EXTERN(void) jpeg_stdio_src JPP((j_decompress_ptr cinfo, char * indata,int nSize));
jdatasrc.cpp 第33行
/* Expanded data source object for stdio input */
typedef struct {
struct jpeg_source_ /* public fields */
/* source stream */
/* start of buffer */
boolean start_of_ /* have we gotten any data yet? */
} my_source_
jdatasrc.cpp 第183行
GLOBAL(void)
jpeg_stdio_src (j_decompress_ptr cinfo, char * indata, int nSize)
/* The source object and input buffer are made permanent so that a series
* of JPEG images can be read from the same file by calling jpeg_stdio_src
* only before the first one.
(If we discarded the buffer at the end of
* one image, we'd likely lose the start of the next one.)
* This makes it unsafe to use this manager and a different source
* manager serially with the same JPEG object.
Caveat programmer.
if (cinfo-&src == NULL) { /* first time for this JPEG object? */
cinfo-&src = (struct jpeg_source_mgr *)
(*cinfo-&mem-&alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
SIZEOF(my_source_mgr));
src = (my_src_ptr) cinfo-&
src-&buffer = (JOCTET *)
(*cinfo-&mem-&alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
INPUT_BUF_SIZE * SIZEOF(JOCTET));
src = (my_src_ptr) cinfo-&
src-&pub.init_source = init_
src-&pub.fill_input_buffer = fill_input_
src-&pub.skip_input_data = skip_input_
src-&pub.resync_to_restart = jpeg_resync_to_ /* use default method */
src-&pub.term_source = term_
src-&indata =
// 新添加行
src-&nSize = nS
src-&nInOffset = 0;
src-&pub.bytes_in_buffer = 0; /* forces fill_input_buffer on first read */
src-&pub.next_input_byte = NULL; /* until buffer loaded */
jdatasrc.cpp 第91行
METHODDEF(boolean)
fill_input_buffer (j_decompress_ptr cinfo)
my_src_ptr src = (my_src_ptr) cinfo-&
//nbytes = JFREAD(src-&infile, src-&buffer, INPUT_BUF_SIZE);
nbytes = src-&nSize-src-&nInO
if (nbytes&INPUT_BUF_SIZE) nbytes = INPUT_BUF_SIZE;
if (nbytes &= 0) {
if (src-&start_of_file) /* Treat empty input file as fatal error */
ERREXIT(cinfo, JERR_INPUT_EMPTY);
WARNMS(cinfo, JWRN_JPEG_EOF);
/* Insert a fake EOI marker */
src-&buffer[0] = (JOCTET) 0xFF;
src-&buffer[1] = (JOCTET) JPEG_EOI;
nbytes = 2;
memcpy(src-&buffer,src-&indata+src-&nInOffset,nbytes);
src-&nInOffset+=
src-&pub.next_input_byte = src-&
src-&pub.bytes_in_buffer =
src-&start_of_file = FALSE;
return TRUE;
至此,libjpeg库的源代码中所有要改的东西我们都已经完成,剩下的事情就是我们编写一段测试程序测试一下。
三、编写测试代码
对于libjpeg库的详细的调用步骤,请参照我的文章《利用jpeglib压缩图像为jpg格式》,上面详细介绍了利用libjpeg库
进行图像压缩和解压缩的步骤,在编写本例的测试代码时,我们在上次提供的测试代码的基础上进行改进,如下:
无论压缩还是解压缩,与原来的libjpeg库调用不同的地方都只有一处,就是jpeg_stdio_dest和jpeg_stdio_src这两个函数的调用,
调用原来的libjpeg库时,需要为这两个函数提供已经打开的jpg文件句柄,而对于新的libjpeg库,不需要打开jpg文件了,压缩时,
我们需要提供足够大的内存区给libjpeg 库,解压缩时,只需要把存放有jpeg格式图像的内存区提供给libjpeg库就行了,下面详细介绍
对于改写后的jpeg_stdio_dest和jpeg_stdio_src这两个函数的调用方法。
1、jpeg_stdio_dest
函数的原形为:void jpeg_stdio_dest(j_compress_ptr cinfo, char * outData, int *pSize);
这里,outData指向我们提供给libjpeg库用于存放压缩后图像数据的内存区,这块内存要在我们调用该函数前申请好,大家可以看到,
我们在libjpeg库内没有对该内存区进行越界访问检查并且要足够大,否则会出现内存越界访问的危险,当整个图像压缩工作完成后,pSize
返回jpg图像数据的大小。测试代码如下:
char outdata[1000000]; // 用于缓存,这里设置为1000K,实际使用时可以采用动态申请的方式
int nS // 用于存放压缩完后图像数据的大小
..........
jpeg_stdio_dest(&jcs, outdata,&nSize);
..........
2、jpeg_stdio_src
函数的原形为:void jpeg_stdio_src(j_decompress_ptr cinfo, char * inData,int nSize);
这里,inData指向我们将要进行解压缩的jpg数据,该数据我们可以直接从jpg文件中读取,也可以是通过libjpeg库在内存中直接压缩
生成的数据,nSize 当然是这个jpg数据的大小。测试代码如下:
..............
char indata[1000000]; // 用于存放解压缩前的图像数据,该数据直接从jpg文件读取
FILE *f = fopen(strSourceFileName,"rb");
if (f==NULL)
printf("Open file error!/n");
int nSize = fread(outdata,1,1000000,f); // 读取jpg图像数据,nSize为实际读取的图像数据大小
fclose(f);
// 下面代码用于解压缩,从本行开始解压缩
jpeg_stdio_src(&cinfo, outdata,nSize);
.............
至此我们所有的工作均已完成,完整的测试程序请从我的资源里下载,为增加兼容性,本测试程序特意加入字节调整功能,以解决部分读者
测试图像时出现的图像倾斜的问题,好了,编译并运行一下测试程序,看看效果吧,如果愿意继续交流,请给我发邮件:
zz:http://blog.chinaunix.net/u2/60941/showart_476046.html
没有更多推荐了,如何把照片jdp转换为word?_百度知道
如何把照片jdp转换为word?
我有更好的答案
1.把jpg文字图片的格式转换成TIFF格式。2.打开另存为窗口,选择保存路径,名称和保存类型,保存类型选择TIFF,另存完成。3.打开“开始”菜单-“所有程序”-“Microsoft Office”-“Microsoft Office工具”-“Microsoft Office Document Imaging”打开。4.打开软件后,选择“文件”-打开刚刚另存为TIFF类型的文件。然后点击“工具”-“使用OCR识别文本...”进行识别后,在点击“将文本发送到word...”。5.开打发送到窗口后,选择保存路径(最好不要存桌面),点击确定完成。转换成word后,也就比较容易转换成txt格式的文档了。
采纳率:74%
来自团队:
用插入图片功能 把图片插到word
或者直接粘贴复制进word
发到我的邮箱 我帮你试试
WORD里有插入图片功能,然后右击图片,修改图片大小等。最后保存WORD
你去找找有一种叫扫描图片文字的软件,不过识别率不是很高,而且如果背景很杂估计很难
1.先把照片在电脑中保存2.打开wps(或者文字文件)3.把照片通过插入打开4.保存就可以了祝你成功
其他6条回答
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。}

我要回帖

更多关于 内存压缩技术 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信