网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
05月23日漏签0天
图形编程forc吧 关注:14贴子:296
  • 看贴

  • 图片

  • 吧主推荐

  • 游戏

  • 3回复贴,共1页
<<返回图形编程forc吧
>0< 加载中...

libjpeg-turbo解码器1.4.90

  • 取消只看楼主
  • 收藏

  • 回复
  • hellovfp
  • 排序查找
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
根据上一篇关于libjpeg的dll编译一文,将手里以前下载的libjpeg-turbo 1.4.90项目中解码器部份提取出来,生成了静态库和动态库,通过了msvc和mingw编译,对图片进行解码测试,没有发现有什么问题,速度还算不错,生成的Dll大概是108K左右。(1.5.3版在mingw下还有编译错误,和limits.h有关)


  • hellovfp
  • 排序查找
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
编译说明:
1.编译时需要添加宏定义,WITH_SIMD,全是大写。否则解码会出错。
2.jdcol565.c ,jdcolext.c,jstdhuff.c 这三个文件不要添加进编译列表,它们是以包含的形式进行编译的。
3.simd目录下的jsimd_i386_c.c是jsimd_i386.c简化出来的解码器部分代码,需要添加进编译列表。
4.要生成dll时,可以使用上个项目中的jpeg6b.def模块定义文件。
5.simd目录下的那些obj文件是nasm生成的汇编文件,已经编译好了,无需使用nasm了,需要全部链结进静态库或是动态库中,Mingw编译也是一样。如果你要自己编译的话可用命令nasm -fwin32 -DWIN32 xxxx.asm进行编译原文件。
项目下载:
链接: https://pan.baidu.com/s/1NeJbPJv2eizWbo-ey4LhhQ 提取码: 6xsc


2025-05-23 03:28:09
广告
  • hellovfp
  • 排序查找
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
解码函数调用
typedef unsigned char uchar;
struct BmpPack
{
uchar * data_ptr;
int width;
int height;
};
#include <stdio.h>
#include <setjmp.h>
#include "jpeglib.h"
#include "bmp.h"
#define WIDTHBYTES(i) ((i+31)/32*4)
static int bmp_stride;
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;
/* Always display the message. */
/* We could postpone this until after returning, if we chose. */
(*cinfo->err->output_message) (cinfo);
/* Return control to the setjmp point */
longjmp(myerr->setjmp_buffer, 1);
}
GLOBAL(int)
read_JPEG_file (char * filename, BmpPack *bp)
{
struct jpeg_decompress_struct cinfo;
struct my_error_mgr jerr;
FILE * infile; /* source file */
JSAMPARRAY in_buffer;
long buff_size;
if ((infile = fopen(filename, "rb")) == NULL) {
fprintf(stderr, "can't open %s\n", filename);
return 0;
}
fseek(infile, 0, SEEK_END);
buff_size = ftell(infile);
fseek(infile, 0, SEEK_SET);
cinfo.err = jpeg_std_error(&jerr.pub);
jerr.pub.error_exit = my_error_exit;
if (setjmp(jerr.setjmp_buffer)) {
jpeg_destroy_decompress(&cinfo);
fclose(infile);
return 0;
}
jpeg_create_decompress(&cinfo);
in_buffer = (*cinfo.mem->alloc_sarray)
((j_common_ptr) &cinfo, JPOOL_IMAGE, buff_size, 1);
fread(in_buffer[0], 1, buff_size, infile);
jpeg_mem_src(&cinfo, in_buffer[0], buff_size);//使用内存解码方式
(void) jpeg_read_header(&cinfo, TRUE);
cinfo.out_color_space = JCS_EXT_BGR; //参数设置,使用bgr颜色输出
(void) jpeg_start_decompress(&cinfo); //到这里并未开始解码
bp->width = cinfo.output_width;
bp->height = cinfo.output_height;
bmp_stride = WIDTHBYTES(cinfo.output_width * 24);
bp->data_ptr = new unsigned char[bmp_stride * cinfo.output_height];
unsigned char *p = bp->data_ptr + bmp_stride * (cinfo.output_height - 1);//反向输出
printf("out:%d-%d\n", cinfo.output_width, cinfo.output_height);
while (cinfo.output_scanline < cinfo.output_height) {
(void) jpeg_read_scanlines(&cinfo, &p, 1);
p-=bmp_stride;
}
(void) jpeg_finish_decompress(&cinfo);
jpeg_destroy_decompress(&cinfo);
fclose(infile);
return 1;
}
其实和上一篇的示例代码基本一样,主要是由于这个解码器改进了色彩输出为JCS_EXT_BGR,所以输出时直接倒序就是bmp格式,可直接显示。
最后,这是第一个版本,解码器优先使用sse2指令,然后才是MMX指令,最后是原始解码,现在的CPU基本都支持这些指令集,所以在我的两台intel机器上测试都可以通过,解码速度比libjpeg要快2倍左右,在解码大尺寸19xx时,特别明显。下一版计划将sse2和mmx部分分离出来,这两个部分各占2XKB,并去除Java里才使用的rgb565色彩输出部分,win32上基本用不上,估计生成的库会更小。


  • hellovfp
  • 排序查找
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
觉得编译麻烦的可以用下面这个MSVC脚本:
buildvc.cmd
@璐村惂鐢ㄦ埛_000076K馃惥 off
cl /c /MD /W3 /O2 /GS /D"WITH_SIMD" /D"NDEBUG" /D"_CRT_SECURE_NO_WARNINGS"
/D"WIN32" jcomapi.c jdapimin.c jdapistd.c jdatasrc.c jdcoefct.c jdcolor.c
jddctmgr.c jdhuff.c jdinput.c jdmainct.c jdmarker.c jdmaster.c jdphuff.c
jdpostct.c jdsample.c jerror.c jidctint.c jidctred.c jmemmgr.c jmemnobs.c
jutils.c simd\jsimd_i386_c.c
link /dll /def:jpeg6b.def /subsystem:windows /out:jpeg6b.dll jcomapi.obj
jdapimin.obj jdapistd.obj jdatasrc.obj jdcoefct.obj jdcolor.obj jddctmgr.obj
jdhuff.obj jdinput.obj jdmainct.obj jdmarker.obj jdmaster.obj jdphuff.obj
jdpostct.obj jdsample.obj jerror.obj jidctint.obj jidctred.obj jmemmgr.obj
jmemnobs.obj jutils.obj jsimd_i386_c.obj simd\jdcolor-mmx.obj simd\jdcolor-
sse2.obj simd\jdsample-mmx.obj simd\jdsample-sse2.obj simd\jidctint-mmx.obj
simd\jidctint-sse2.obj simd\jidctred-mmx.obj simd\jidctred-sse2.obj simd
\jsimdcpu.obj
@echo 清理临时文件.
del *.obj


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 3回复贴,共1页
<<返回图形编程forc吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示