整站优化seo平台,南京机械加工网,看汽车图片的网站可以做壁纸,软件平台拓扑图众所周知#xff0c;bing搜索网站首页每日会更新一张图片#xff0c;张张漂亮#xff08;额#xff0c;也有一些不合我口味的#xff09;#xff0c;特别适合用来做电脑壁纸。 我们想要将bing网站背景图片设置为电脑桌面背景的通常做法是#xff1a; 上网#xff0c;搜…众所周知bing搜索网站首页每日会更新一张图片张张漂亮额也有一些不合我口味的特别适合用来做电脑壁纸。 我们想要将bing网站背景图片设置为电脑桌面背景的通常做法是 上网搜索bing找到图片的下载链接并下载之将图片设置为桌面背景也有部分浏览器支持直接在网页中右击图片设置为壁纸可能你还会删除下载下来的图片作为一枚coder你不会觉得麻烦嘛至少需要三个步骤呢 So...我就用C语言写了一个小程序用于获取bing网站的图片并将其设置为桌面背景。整个过程只需要点击.exe文件一键完成 当然你也可以通过本程序窥见Windows API的些许用法活学活用C知识 当然网上也存在片片断断的程序我的部分程序也借鉴了它们的思想在此感谢互联网和辛勤的贡献者们。 以下是程序设计的技术要点 -------------------------------------------------------------- 技术要点 1、获取网络地址 直接使用网络地址或下载 注意若下载下来后要将\转换为/,当然也可以用\\ 网络地址可以从这里获取http://cn.bing.com/HPImageArchive.aspx?formatxmlidx0n1 在返回的xml页面中(images-image-url)找到具体的图片地址(xml解析)拼接到bing域名后面构成完整地址 注xml解析用了TinyXml2 2、转换图片格式(jpg-bmp)本程序中的SystemParametersInfoA函数只支持bmp 在程序中自动转换(单单改后缀名是没有用的)转换用的程序是从网上下载的用C语言编写而成 考虑到需要改后缀名那就直接下载图片好了顺便存储之 3、图片保存路径为C:/Users/Administrator/bingPicture/,格式为.jpg 方便以后浏览 注意部分用户电脑可能不存在路径C:/Users/Administrator/,造成程序无法执行可以直接在C盘根目录下创建路径如C:/bingPicture/ 注意不保存转换后的bmp格式图片(设置背景后即删除)因为体积较大 判断文件夹是否存在若不存在则自动创建文件夹 4、注意本程序获取的图片尺寸是1366x768若你的屏幕分辨率为1920x1080还需要对Xml解析出来的图片Url地址进行字符串替换将1366x768换成1920x1080即可 前提针对1920x1080尺寸的图片地址存在 5、若此程序若在国际网络下运行获取的就是国际版bing壁纸若在国内网络下运行获取的就是中国版bing壁纸。因此在同一天内在不同网络环境下获取的图片可能不同 *未实现的功能* 1、获取每日壁纸的故事(利用bing故事接口) 更新壁纸后显示在执行框中 2、开机自启动并隐藏到托盘中(为减少CPU占用并增加趣味性设置为开机自动启动提示网络连接并输入go才执行功能) 电脑若未关机则在24:00自动启动更换背景 3、软件自动更新版本功能 -------------------------------------------------------------- 程序在文章后面提供源码已注释很详细不再赘述。 注意使用程序之前务必看以下注意事项 -------------------------------------------------------------- 请注意 1、本软件使用Qt开发您也可以将文件加入自己的工程使用其他IDE开发 需要注意的一点是本软件需要加入URLMON.DLL源码包中有 2、本软件开源(源码位于xiaoxi666的博客园以及github不对其他地址给出的链接负责)仅用于学习交流请勿用于商业用途 3、为防止软件被加入恶意功能不提供可执行文件若需使用请重新编译编译器需要支持c11 4、本软件程序中内含删除临时文件功能请在更改前仔细确认避免路径错误而删除其他重要文件 -------------------------------------------------------------- 然而许多小伙伴要体验效果我就一并把可执行文件放出来吧请勿随意传播.exe文件防止有人添加恶意功能。当然源码开放可共享 下载区 源码可执行文件可执行文件中图片保存地址为C:/bingPicture/但一定要注意核对文件校验码以保证安全 可执行文件压缩包WallPaper校验码 MD5: 48173BA7DCF2120F2822226A5D4A90CF SHA1: CEB0ED570AF613EC3829AC8FDE4F8C50DDEF4101 可执行文件WallPaper_1366x768_Common校验码(此版本用于1366x768分辨率) MD5: ACDA8E5E4CF0B2916254B233D1243FD3 SHA1: 6041C813DC8E2AE29EA8675EF279CFC0E7921D53 可执行文件WallPaper_1920x1080_Common校验码(此版本用于1920x1080分辨率) MD5: 474570808A56EFDC7B589F605D08C5B6 SHA1: B78921AD655B35F079076904A22F1A0E5122EB7F 为方便浏览贴出主要源程序 main.cpp文件 1 //main.cpp2 /******************windows桌面背景更换C程序***********************************************************3 功能获取每日bing搜索主页图片设置为当日桌面壁纸。并将其下载保存至本地文件夹方便以后浏览4 作者xiaoxi6665 日期2017/03/126 7 技术要点8 1、获取网络地址 直接使用网络地址或下载 注意若下载下来后要将\转换为/,当然也可以用\\9 网络地址可以从这里获取http://cn.bing.com/HPImageArchive.aspx?formatxmlidx0n110 在返回 的xml页面中(images-image-url)找到具体的图片地址(xml解析)拼接到bing域名后面构成完整地址11 注xml解析用了TinyXml212 13 2、转换图片格式(jpg-bmp)本程序中的SystemParametersInfoA函数只支持bmp14 在程序中自动转换(单单改后缀名是没有用的)转换用的程序是从网上下载的用C语言编写而成15 考虑到需要改后缀名那就直接下载图片好了顺便存储之16 17 3、图片保存路径为C:\bingPicture\,格式为.jpg 方便以后浏览18 注意不保存转换后的bmp格式图片(设置背景后即删除)因为体积较大19 判断文件夹是否存在若不存在则自动创建文件夹20 21 *未实现的功能*22 ***获取每日壁纸的故事(利用bing故事接口) 更新壁纸后显示在执行框中23 24 ***开机自启动并隐藏到托盘中(为减少CPU占用并增加趣味性设置为开机自动启动提示网络连接并输入go才执行功能)25 电脑若未关机则在24:00自动启动更换背景26 27 ***软件自动更新版本功能28 29 ******************************************************************************************************/30 31 #include iostream //输入输出32 #include cstring //文件命名处理需要用字符串33 #include windows.h //调用操作系统各种API34 #include ctime //获取时间各种文件命名35 #include UrlMon.h //包含提供下载服务的API36 #include tinyxml2.h //解析XML37 #include io.h //判断文件夹是否存在38 #include direct.h //创建文件夹39 extern C40 {41 #include jpeg.h //转换图片格式jpg-bmp 转换格式的程序使用C语言写的42 }43 44 //创建本地bingPicture路径和Tmp路径45 void createDir()46 {47 //本地bingPicture路径48 std::string LocalFolderC:/bingPicture/;49 50 if(0!access(LocalFolder.c_str(),0)) //判断文件夹是否存在若不存在则创建51 if(0!mkdir(LocalFolder.c_str()))52 std::cout创建文件夹bingPicture失败std::endl;53 else54 std::cout创建文件夹bingPicture成功std::endl;55 else56 std::cout文件夹bingPicture已存在std::endl;57 58 //本地Tmp路径59 std::string LocalXmlFolderC:/bingPicture/Tmp/;60 61 if(0!access(LocalXmlFolder.c_str(),0)) //判断文件夹是否存在若不存在则创建62 if(0!mkdir(LocalXmlFolder.c_str()))63 std::cout创建临时文件夹Tmp失败std::endl;64 else65 std::cout创建临时文件夹Tmp成功std::endl;66 else67 std::cout临时文件夹Tmp已存在std::endl;68 69 }70 71 /**************************************************************************************72 首先明白一个概念即string替换所有字符串将12212这个字符串的所有12都替换成21结果是什么73 可以是22211也可以是21221有时候应用的场景不同就会希望得到不同的结果所以这两种答案都做了实现。74 **************************************************************************************/75 //替换字符串方法1(完全轮询替换一次后接着再次扫描因为替换一次后可能又出现了满足替换条件的字符串)76 std::string replace_all(std::string str,const std::string old_value,const std::string new_value)77 {78 while(true) {79 std::string::size_type pos(0);80 if((posstr.find(old_value))!std::string::npos)81 str.replace(pos,old_value.length(),new_value);82 else83 break;84 }85 return str;86 }87 88 //替换字符串方法2(只替换一次) 本项目中只替换\为/用方法2即可89 std::string replace_all_distinct(std::string str,const std::string old_value,const std::string new_value)90 {91 for(std::string::size_type pos(0); pos!std::string::npos; posnew_value.length())92 {93 if((posstr.find(old_value,pos))!std::string::npos)94 str.replace(pos,old_value.length(),new_value);95 else break;96 }97 return str;98 }99
100 //获取年月日(命名用)
101 std::string getYearMonthDay()
102 {
103 time_t timer;
104 time(timer);
105 tm* t_tm localtime(timer);
106
107 std::string Yearstd::to_string(t_tm-tm_year1900);
108 std::string Monthstd::to_string(t_tm-tm_mon1);
109 std::string Daystd::to_string(t_tm-tm_mday);
110 std::string PictureNameYear_Month_Day;
111
112 return PictureName;
113 }
114
115 //获取图片的Xml并解析图片的url路径
116 std::string getPicTureXmlAndUrl()
117 {
118 //网络上的XML路径
119 std::string WebXmlpath http://cn.bing.com/HPImageArchive.aspx?formatxmlidx0n1;
120 //本地Xml路径
121 std::string LocalXmlFolderC:/bingPicture/Tmp/;
122 std::string LocalXmleachgetYearMonthDay();
123 std::string LocalXmlFullpathLocalXmlFolderLocalXmleach.xml;
124
125 if(URLDownloadToFileA(NULL,
126 WebXmlpath.c_str(),
127 LocalXmlFullpath.c_str(),
128 0,
129 NULL)
130 S_OK)
131 {
132 std::coutXml下载成功即将解析今日壁纸Urlstd::endl;
133
134 /***************下面开始解析xml中的url路径*******************/
135 tinyxml2::XMLDocument doc;
136 if(tinyxml2::XML_SUCCESS ! doc.LoadFile(LocalXmlFullpath.c_str()))
137 std::cout读取Xml文件异常std::endl;
138 tinyxml2::XMLElement *imagesdoc.RootElement();
139 tinyxml2::XMLElement *image images-FirstChildElement(image);
140
141 //图片Url
142 std::string WebPicturedomainhttp://cn.bing.com;
143 std::string WebPictureUrl;
144
145 if(image!NULL)
146 WebPictureUrlimage-FirstChildElement(url)-GetText();
147
148 std::string WebPictureFullpath1366x768 WebPicturedomainWebPictureUrl;
149 std::cout今日壁纸Url解析成功!std::endl;
150 /*********************************************************/
151 return WebPictureFullpath1366x768;
152 // //将1366x768换成1920x1080
153 // std::string WebPictureFullpath1920x1080 replace_all_distinct(WebPictureFullpath1366x768,1366x768,1920x1080);
154
155 // return WebPictureFullpath1920x1080;
156 }
157 else
158 {
159 std::coutXml下载失败无法获取图片Url请检查网络连接是否正常std::endl;
160 return error;
161 }
162
163 }
164
165 //从网络上下载图片并存储到本地
166 std::string getPicture(std::string WebFullpath)
167 {
168 //本地存储路径
169 std::string LocalFolderC:/bingPicture/;
170 std::string LocaleachgetYearMonthDay();
171 std::string LocalFullpathLocalFolderLocaleach.jpg;
172
173 if(URLDownloadToFileA(NULL,
174 WebFullpath.c_str(),
175 LocalFullpath.c_str(),
176 0,
177 NULL)
178 S_OK)
179 {
180 std::cout今日壁纸下载成功std::endl;
181
182 /***************下面转换图片格式jpg-bmp******************/
183 //临时文件夹Tmp路径
184 std::string TmpFolderC:/bingPicture/Tmp/;
185 //.bmp图片路径
186 std::string bmpFolderTmpFoldergetYearMonthDay().bmp;
187 LoadJpegFile(const_castchar *(LocalFullpath.c_str()),const_castchar *(bmpFolder.c_str()));
188 /*******************************************************/
189 return bmpFolder;
190 }
191 else
192 {
193 std::cout壁纸下载失败请检查网络连接是否正常std::endl;
194 return error;
195 }
196 }
197
198 //改变桌面背景成功后删除bmp文件和xml文件(只保留jpg文件)此步骤需要小心避免删除错误路径下的内容
199 void deleteBmpAndXml()
200 {
201 //临时文件夹Tmp路径
202 std::string TmpFolderC:/bingPicture/Tmp/;
203 //.bmp图片路径
204 std::string bmpFolderTmpFoldergetYearMonthDay().bmp;
205 //xml文件路径
206 std::string xmlFolderTmpFoldergetYearMonthDay().xml;
207
208 if(0access(C:/bingPicture/Tmp/,0)) //判断文件夹是否存在若存在则删除
209 {
210 //删除bmp图片
211 if(0access(bmpFolder.c_str(),0))
212 {
213 if(0remove(bmpFolder.c_str()))
214 std::cout删除临时bmp格式图片成功std::endl;
215 else
216 std::cout删除临时bmp格式图片失败std::endl;
217 }
218 else
219 std::cout临时bmp格式图片不存在std::endl;
220
221 //删除xml文件
222 if(0access(xmlFolder.c_str(),0))
223 {
224 if(0remove(xmlFolder.c_str()))
225 std::cout删除xml文件成功std::endl;
226 else
227 std::cout删除xml文件失败std::endl;
228 }
229 else
230 std::coutxml文件不存在std::endl;
231
232 //删除Tmp文件夹(注意此函数只能删除空文件夹,因此要先删除文件夹中的文件)
233 if(0rmdir(TmpFolder.c_str()))
234 std::cout临时文件夹Tmp已删除std::endl;
235 else
236 std::cout临时文件夹Tmp删除失败std::endl;
237 }
238 else
239 std::cout临时文件夹Tmp不存在std::endl;
240
241 }
242
243 //改变桌面背景(PictureFullpath:图片完整路径)
244 void changePicture(std::string PictureFullpath)
245 {
246 bool resultfalse;
247 resultSystemParametersInfoA(SPI_SETDESKWALLPAPER,
248 0,
249 (PVOID)PictureFullpath.c_str(),
250 0);
251 if(resultfalse)
252 {
253 std::cout今日壁纸更新失败请联系开发人员std::endl;
254 }
255
256 else
257 {
258 SystemParametersInfoA(SPI_SETDESKWALLPAPER,
259 0,
260 (PVOID)PictureFullpath.c_str(),
261 SPIF_SENDCHANGE);
262 //deleteBmpAndXml(); //windows8及其以上会变成黑色把这条语句放到main最后面就没问题具体原因未知
263 system(cls);
264 std::coutversion:1.0.0 (Author:xiaoxi666)std::endlstd::endl;
265 std::cout今日壁纸更新成功std::endlstd::endl;
266 std::cout美好的一天开始啦用心享受吧std::endlstd::endl;
267 }
268 }
269
270 int main()
271 {
272 std::string startOrder;
273 std::cout嗨小伙伴你的贴心壁纸小助手已启动将为你设置今日壁纸哦std::endlstd::endl;
274 std::cout请确保电脑网络连接状况良好,准备好后输入gostd::endlstd::endl;
275 std::cout请输入指令 ;
276 std::cinstartOrder;
277 while(go!startOrder)
278 {
279 std::cout哎呀输错了呢,重新输入吧 ;
280 std::cinstartOrder;
281 }
282 if(gostartOrder)
283 {
284 createDir();
285 changePicture(getPicture(getPicTureXmlAndUrl()));
286 }
287
288 /*******************************以下为个性化字幕输出与程序核心功能无关************************/
289 std::string umua0 ** ** ******** ******* ******* *** *** ;
290 std::string umua1 ** ** ******** ******* ******* *** *** ;
291 std::string umua2 ** ** ** ** ** ** *** ** *** *** ;
292 std::string umua3 ** ** ** ** ** ** *** ** ** ** ;
293 std::string umua4 ********* ******** ******* ******* * * ;
294 std::string umua5 ********* ******** ******* ** ** ;
295 std::string umua6 ** ** ** ** ** ** ** ;
296 std::string umua7 ** ** ** ** ** ** ** ;
297 std::string umua8 ** ** ** ** ** ** ** ;
298 std::string umua9 ** ** ** ** ** ** ** ;
299
300 #define mua(n) std::coutumua##nstd::endl;
301 std::coutstd::endlstd::endl;
302 mua(0);mua(1);mua(2);mua(3);mua(4);mua(5);mua(6);mua(7);mua(8);mua(9);
303 std::coutstd::endlstd::endlstd::endl;
304 system(pause);
305 /******************************************************************************************/
306 deleteBmpAndXml();
307 return 0;
308 } View Code 图片格式转换程序这个是网上下载的C源码我改了一下接口在此感谢 jpeg.h //头文件jpeg.h配合程序jpeg2bmp.c使用
//若用于c程序中请用extern C包含此头文件
//功能用于将图片从jpg类型转换为bmp类型,调用函数LoadJpegFile即可参数1jpg文件路径参数2bmp文件路径#define M_SOF0 0xc0
#define M_DHT 0xc4
#define M_EOI 0xd9
#define M_SOS 0xda
#define M_DQT 0xdb
#define M_DRI 0xdd
#define M_APP0 0xe0static int Zig_Zag[8][8]{{0,1,5,6,14,15,27,28},{2,4,7,13,16,26,29,42},{3,8,12,17,25,30,41,43},{9,11,18,24,37,40,44,53},{10,19,23,32,39,45,52,54},{20,22,33,38,46,51,55,60},{21,34,37,47,50,56,59,61},{35,36,48,49,57,58,62,63}};#define W1 2841 /* 2048*sqrt(2)*cos(1*pi/16) */
#define W2 2676 /* 2048*sqrt(2)*cos(2*pi/16) */
#define W3 2408 /* 2048*sqrt(2)*cos(3*pi/16) */
#define W5 1609 /* 2048*sqrt(2)*cos(5*pi/16) */
#define W6 1108 /* 2048*sqrt(2)*cos(6*pi/16) */
#define W7 565 /* 2048*sqrt(2)*cos(7*pi/16) */int LoadJpegFile (char *JpegFileName,char *bmpFileName); View Code jpeg2bmp.c //jpeg.c
//本程序用C语言编写若用于c程序中请用extern C包含头文件jpeg.h
//功能用于将图片从jpg类型转换为bmp类型,调用函数LoadJpegFile即可参数1jpg文件路径参数2bmp文件路径#include jpeg.h
#include memory.h
#include math.h
#include stdio.h
#include windows.h//macro definition
#define WIDTHBYTES(i) ((i31)/32*4)
#define PI 3.1415926535
//define return value of function
#define FUNC_OK 0
#define FUNC_MEMORY_ERROR 1
#define FUNC_FILE_ERROR 2
#define FUNC_FORMAT_ERROR 3
//
//Jpeg functions
//int LoadJpegFile (char *JpegFileName,char *bmpFileName);
void showerror(int funcret);
int InitTag();
void InitTable();
int Decode();
int DecodeMCUBlock();
int HufBlock(unsigned char dchufindex,unsigned char achufindex);
int DecodeElement();
void IQtIZzMCUComponent(short flag);
void IQtIZzBlock(short *s ,int * d,short flag);
void GetYUV(short flag);
void StoreBuffer();
BYTE ReadByte();
void Initialize_Fast_IDCT();
void Fast_IDCT(int * block);
void idctrow(int * blk);
void idctcol(int * blk);
//
//global variable declaration
BITMAPFILEHEADER bf;
BITMAPINFOHEADER bi;
HBITMAP hBitmapNULL;
HGLOBAL hImgDataNULL;
DWORD NumColors;
DWORD LineBytes;
DWORD ImgWidth0 , ImgHeight0;
unsigned int PcxBytesPerLine;
LPSTR lpPtr;
//
//variables used in jpeg function
short SampRate_Y_H,SampRate_Y_V;
short SampRate_U_H,SampRate_U_V;
short SampRate_V_H,SampRate_V_V;
short H_YtoU,V_YtoU,H_YtoV,V_YtoV;
short Y_in_MCU,U_in_MCU,V_in_MCU;
unsigned char *lpJpegBuf;
unsigned char *lp;
short qt_table[3][64];
short comp_num;
BYTE comp_index[3];
BYTE YDcIndex,YAcIndex,UVDcIndex,UVAcIndex;
BYTE HufTabIndex;
short *YQtTable,*UQtTable,*VQtTable;
BYTE And[9]{0,1,3,7,0xf,0x1f,0x3f,0x7f,0xff};
short code_pos_table[4][16],code_len_table[4][16];
unsigned short code_value_table[4][256];
unsigned short huf_max_value[4][16],huf_min_value[4][16];
short BitPos,CurByte;
short rrun,vvalue;
short MCUBuffer[10*64];
int QtZzMCUBuffer[10*64];
short BlockBuffer[64];
short ycoef,ucoef,vcoef;
BOOL IntervalFlag;
short interval0;
int Y[4*64],U[4*64],V[4*64];
DWORD sizei,sizej;
short restart;
static long iclip[1024];
static long *iclp;////
int LoadJpegFile (char *JpegFileName,char *bmpFileName)
{HFILE hfjpg;DWORD ImgSize;DWORD JpegBufSize;HFILE hfbmp;HGLOBAL hJpegBuf;int funcret;LPBITMAPINFOHEADER lpImgData;if((hfjpg_lopen(JpegFileName,OF_READ))HFILE_ERROR){showerror(FUNC_FILE_ERROR);return 0;}//get jpg file lengthJpegBufSize_llseek(hfjpg,0L,SEEK_END);//rewind to the beginning of the file_llseek(hfjpg,0L,SEEK_SET);if((hJpegBufGlobalAlloc(GHND,JpegBufSize))NULL){_lclose(hfjpg);showerror(FUNC_MEMORY_ERROR);return 0;}lpJpegBuf(unsigned char *)GlobalLock(hJpegBuf);_hread(hfjpg,(unsigned char *)lpJpegBuf,JpegBufSize);_lclose(hfjpg);InitTable();if((funcretInitTag())!FUNC_OK){GlobalUnlock(hJpegBuf);GlobalFree(hJpegBuf);showerror(funcret);return 0;}//create new bitmapfileheader and bitmapinfoheadermemset((char *)bf,0,sizeof(BITMAPFILEHEADER)); memset((char *)bi,0,sizeof(BITMAPINFOHEADER));bi.biSize(DWORD)sizeof(BITMAPINFOHEADER);bi.biWidth(LONG)(ImgWidth);bi.biHeight(LONG)(ImgHeight);bi.biPlanes1;bi.biBitCount24;bi.biClrUsed0;bi.biClrImportant0;bi.biCompressionBI_RGB;NumColors0;LineBytes(DWORD)WIDTHBYTES(bi.biWidth*bi.biBitCount);ImgSize(DWORD)LineBytes*bi.biHeight;bf.bfType0x4d42;bf.bfSizesizeof(BITMAPFILEHEADER)sizeof(BITMAPINFOHEADER)NumColors*sizeof(RGBQUAD)ImgSize;bf.bfOffBits(DWORD)(NumColors*sizeof(RGBQUAD)sizeof(BITMAPFILEHEADER)sizeof(BITMAPINFOHEADER));if((hImgDataGlobalAlloc(GHND,ImgSize))NULL){GlobalUnlock(hJpegBuf);GlobalFree(hJpegBuf);showerror(FUNC_MEMORY_ERROR);return FALSE;}lpImgData(LPBITMAPINFOHEADER)GlobalLock(hImgData); lpPtr(char *)lpImgData;if((SampRate_Y_H0)||(SampRate_Y_V0)){GlobalUnlock(hJpegBuf);GlobalFree(hJpegBuf);GlobalUnlock(hImgData);GlobalFree(hImgData);hImgDataNULL;showerror(FUNC_FORMAT_ERROR);return FALSE ;}funcretDecode();if(funcretFUNC_OK){hfbmp_lcreat(bmpFileName,0);_lwrite(hfbmp,(LPSTR)bf,sizeof(BITMAPFILEHEADER)); //写BMP文件头_lwrite(hfbmp,(LPSTR)bi,sizeof(BITMAPINFOHEADER)); //写BMP文件信息_lwrite(hfbmp,(LPSTR)lpImgData,ImgSize); //写BMP位图数据_lclose(hfbmp);GlobalUnlock(hJpegBuf);GlobalFree(hJpegBuf);GlobalUnlock(hImgData);return TRUE;}else{GlobalUnlock(hJpegBuf);GlobalFree(hJpegBuf);GlobalUnlock(hImgData);GlobalFree(hImgData);hImgDataNULL;showerror(funcret);return FALSE;}
}
/
void showerror(int funcret)
{switch(funcret){case FUNC_MEMORY_ERROR:printf(Error alloc memory!\n); exit(1);break;case FUNC_FILE_ERROR:printf(File not found!!\n); exit(1);break;case FUNC_FORMAT_ERROR:printf(File format error!\n); exit(1);break;}
}
////
int InitTag()
{BOOL finishFALSE;BYTE id;short llength;short i,j,k;short huftab1,huftab2;short huftabindex;BYTE hf_table_index;BYTE qt_table_index;BYTE comnum;unsigned char *lptemp;short ccount;lplpJpegBuf2;while (!finish){id*(lp1);lp2;switch (id){case M_APP0:llengthMAKEWORD(*(lp1),*lp);lpllength;break;case M_DQT:llengthMAKEWORD(*(lp1),*lp);qt_table_index(*(lp2))0x0f;lptemplp3;if(llength80){for(i0;i64;i)qt_table[qt_table_index][i](short)*(lptemp);}else{for(i0;i64;i)qt_table[qt_table_index][i](short)*(lptemp);qt_table_index(*(lptemp))0x0f;for(i0;i64;i)qt_table[qt_table_index][i](short)*(lptemp);}lpllength; break;case M_SOF0:llengthMAKEWORD(*(lp1),*lp);ImgHeightMAKEWORD(*(lp4),*(lp3));ImgWidthMAKEWORD(*(lp6),*(lp5));comp_num*(lp7);if((comp_num!1)(comp_num!3))return FUNC_FORMAT_ERROR;if(comp_num3){comp_index[0]*(lp8);SampRate_Y_H(*(lp9))4;SampRate_Y_V(*(lp9))0x0f;YQtTable(short *)qt_table[*(lp10)];comp_index[1]*(lp11);SampRate_U_H(*(lp12))4;SampRate_U_V(*(lp12))0x0f;UQtTable(short *)qt_table[*(lp13)];comp_index[2]*(lp14);SampRate_V_H(*(lp15))4;SampRate_V_V(*(lp15))0x0f;VQtTable(short *)qt_table[*(lp16)];}else{comp_index[0]*(lp8);SampRate_Y_H(*(lp9))4;SampRate_Y_V(*(lp9))0x0f;YQtTable(short *)qt_table[*(lp10)];comp_index[1]*(lp8);SampRate_U_H1;SampRate_U_V1;UQtTable(short *)qt_table[*(lp10)];comp_index[2]*(lp8);SampRate_V_H1;SampRate_V_V1;VQtTable(short *)qt_table[*(lp10)];}lpllength; break;case M_DHT: llengthMAKEWORD(*(lp1),*lp);if (llength0xd0){huftab1(short)(*(lp2))4; //huftab10,1huftab2(short)(*(lp2))0x0f; //huftab20,1huftabindexhuftab1*2huftab2;lptemplp3;for (i0; i16; i)code_len_table[huftabindex][i](short)(*(lptemp));j0;for (i0; i16; i)if(code_len_table[huftabindex][i]!0){k0;while(kcode_len_table[huftabindex][i]){code_value_table[huftabindex][kj](short)(*(lptemp));k;}jk; }i0;while (code_len_table[huftabindex][i]0)i;for (j0;ji;j){huf_min_value[huftabindex][j]0;huf_max_value[huftabindex][j]0;}huf_min_value[huftabindex][i]0;huf_max_value[huftabindex][i]code_len_table[huftabindex][i]-1;for (ji1;j16;j){huf_min_value[huftabindex][j](huf_max_value[huftabindex][j-1]1)1;huf_max_value[huftabindex][j]huf_min_value[huftabindex][j]code_len_table[huftabindex][j]-1;}code_pos_table[huftabindex][0]0;for (j1;j16;j)code_pos_table[huftabindex][j]code_len_table[huftabindex][j-1]code_pos_table[huftabindex][j-1];lpllength;} //ifelse{hf_table_index*(lp2);lp2;while (hf_table_index!0xff){huftab1(short)hf_table_index4; //huftab10,1huftab2(short)hf_table_index0x0f; //huftab20,1huftabindexhuftab1*2huftab2;lptemplp1;ccount0;for (i0; i16; i){code_len_table[huftabindex][i](short)(*(lptemp));ccountcode_len_table[huftabindex][i];}ccount17; j0;for (i0; i16; i)if(code_len_table[huftabindex][i]!0){k0;while(kcode_len_table[huftabindex][i]){code_value_table[huftabindex][kj](short)(*(lptemp));k;}jk;}i0;while (code_len_table[huftabindex][i]0)i;for (j0;ji;j){huf_min_value[huftabindex][j]0;huf_max_value[huftabindex][j]0;}huf_min_value[huftabindex][i]0;huf_max_value[huftabindex][i]code_len_table[huftabindex][i]-1;for (ji1;j16;j){huf_min_value[huftabindex][j](huf_max_value[huftabindex][j-1]1)1;huf_max_value[huftabindex][j]huf_min_value[huftabindex][j]code_len_table[huftabindex][j]-1;}code_pos_table[huftabindex][0]0;for (j1;j16;j)code_pos_table[huftabindex][j]code_len_table[huftabindex][j-1]code_pos_table[huftabindex][j-1];lpccount;hf_table_index*lp;} //while} //elsebreak;case M_DRI:llengthMAKEWORD(*(lp1),*lp);restartMAKEWORD(*(lp3),*(lp2));lpllength;break;case M_SOS:llengthMAKEWORD(*(lp1),*lp);comnum*(lp2);if(comnum!comp_num)return FUNC_FORMAT_ERROR;lptemplp3;for (i0;icomp_num;i){if(*lptempcomp_index[0]){YDcIndex(*(lptemp1))4; //YYAcIndex((*(lptemp1))0x0f)2;}else{UVDcIndex(*(lptemp1))4; //U,VUVAcIndex((*(lptemp1))0x0f)2;}lptemp2;}lpllength;finishTRUE;break;case M_EOI: return FUNC_FORMAT_ERROR;break;default:if ((id0xf0)!0xd0){llengthMAKEWORD(*(lp1),*lp);lpllength;}else lp2;break;} //switch} //whilereturn FUNC_OK;
}
/////
void InitTable()
{short i,j;sizeisizej0;ImgWidthImgHeight0;rrunvvalue0;BitPos0;CurByte0;IntervalFlagFALSE;restart0;for(i0;i3;i)for(j0;j64;j)qt_table[i][j]0;comp_num0;HufTabIndex0;for(i0;i3;i)comp_index[i]0;for(i0;i4;i)for(j0;j16;j){code_len_table[i][j]0;code_pos_table[i][j]0;huf_max_value[i][j]0;huf_min_value[i][j]0;}for(i0;i4;i)for(j0;j256;j)code_value_table[i][j]0;for(i0;i10*64;i){MCUBuffer[i]0;QtZzMCUBuffer[i]0;}for(i0;i4*64;i){Y[i]0;U[i]0;V[i]0; }for(i0;i64;i)BlockBuffer[i]0;ycoefucoefvcoef0;
}
/
int Decode()
{int funcret;Y_in_MCUSampRate_Y_H*SampRate_Y_V;U_in_MCUSampRate_U_H*SampRate_U_V;V_in_MCUSampRate_V_H*SampRate_V_V;H_YtoUSampRate_Y_H/SampRate_U_H;V_YtoUSampRate_Y_V/SampRate_U_V;H_YtoVSampRate_Y_H/SampRate_V_H;V_YtoVSampRate_Y_V/SampRate_V_V;Initialize_Fast_IDCT();while((funcretDecodeMCUBlock())FUNC_OK){interval;if((restart)(interval % restart0))IntervalFlagTRUE;elseIntervalFlagFALSE;IQtIZzMCUComponent(0);IQtIZzMCUComponent(1);IQtIZzMCUComponent(2);GetYUV(0);GetYUV(1);GetYUV(2);StoreBuffer();sizejSampRate_Y_H*8;if(sizejImgWidth){sizej0;sizeiSampRate_Y_V*8;}if ((sizej0)(sizeiImgHeight))break;}return funcret;
}
/////
void GetYUV(short flag)
{short H,VV;short i,j,k,h;int *buf;int *pQtZzMCU;switch(flag){case 0:HSampRate_Y_H;VVSampRate_Y_V;bufY;pQtZzMCUQtZzMCUBuffer;break;case 1:HSampRate_U_H;VVSampRate_U_V;bufU;pQtZzMCUQtZzMCUBufferY_in_MCU*64;break;case 2:HSampRate_V_H;VVSampRate_V_V;bufV;pQtZzMCUQtZzMCUBuffer(Y_in_MCUU_in_MCU)*64;break;}for (i0;iVV;i)for(j0;jH;j)for(k0;k8;k)for(h0;h8;h)buf[(i*8k)*SampRate_Y_H*8j*8h]*pQtZzMCU;
}
///
void StoreBuffer()
{short i,j;unsigned char *lpbmp;unsigned char R,G,B;int y,u,v,rr,gg,bb;for(i0;iSampRate_Y_V*8;i){if((sizeii)ImgHeight){lpbmp((unsigned char *)lpPtr(DWORD)(ImgHeight-sizei-i-1)*LineBytessizej*3);for(j0;jSampRate_Y_H*8;j){if((sizejj)ImgWidth){yY[i*8*SampRate_Y_Hj];uU[(i/V_YtoU)*8*SampRate_Y_Hj/H_YtoU];vV[(i/V_YtoV)*8*SampRate_Y_Hj/H_YtoV];rr((y8)18*u367*v)8;gg((y8)-159*u-220*v)8;bb((y8)411*u-29*v)8;R(unsigned char)rr;G(unsigned char)gg;B(unsigned char)bb;if (rr0xffffff00) if (rr255) R255; else if (rr0) R0;if (gg0xffffff00) if (gg255) G255; else if (gg0) G0;if (bb0xffffff00) if (bb255) B255; else if (bb0) B0;*lpbmpB;*lpbmpG;*lpbmpR;}else break;}}else break;}
}
///
int DecodeMCUBlock()
{short *lpMCUBuffer;short i,j;int funcret;if (IntervalFlag){lp2;ycoefucoefvcoef0;BitPos0;CurByte0;}switch(comp_num){case 3:lpMCUBufferMCUBuffer;for (i0;iSampRate_Y_H*SampRate_Y_V;i) //Y{funcretHufBlock(YDcIndex,YAcIndex);if (funcret!FUNC_OK)return funcret;BlockBuffer[0]BlockBuffer[0]ycoef;ycoefBlockBuffer[0];for (j0;j64;j)*lpMCUBufferBlockBuffer[j];}for (i0;iSampRate_U_H*SampRate_U_V;i) //U{funcretHufBlock(UVDcIndex,UVAcIndex);if (funcret!FUNC_OK)return funcret;BlockBuffer[0]BlockBuffer[0]ucoef;ucoefBlockBuffer[0];for (j0;j64;j)*lpMCUBufferBlockBuffer[j];}for (i0;iSampRate_V_H*SampRate_V_V;i) //V{funcretHufBlock(UVDcIndex,UVAcIndex);if (funcret!FUNC_OK)return funcret;BlockBuffer[0]BlockBuffer[0]vcoef;vcoefBlockBuffer[0];for (j0;j64;j)*lpMCUBufferBlockBuffer[j];}break;case 1:lpMCUBufferMCUBuffer;funcretHufBlock(YDcIndex,YAcIndex);if (funcret!FUNC_OK)return funcret;BlockBuffer[0]BlockBuffer[0]ycoef;ycoefBlockBuffer[0];for (j0;j64;j)*lpMCUBufferBlockBuffer[j];for (i0;i128;i)*lpMCUBuffer0;break;default:return FUNC_FORMAT_ERROR;}return FUNC_OK;
}
//
int HufBlock(BYTE dchufindex,BYTE achufindex)
{short count0;short i;int funcret;//dcHufTabIndexdchufindex;funcretDecodeElement();if(funcret!FUNC_OK)return funcret;BlockBuffer[count]vvalue;//acHufTabIndexachufindex;while (count64){funcretDecodeElement();if(funcret!FUNC_OK)return funcret;if ((rrun0)(vvalue0)){for (icount;i64;i)BlockBuffer[i]0;count64;}else{for (i0;irrun;i)BlockBuffer[count]0;BlockBuffer[count]vvalue;}}return FUNC_OK;
}
//
int DecodeElement()
{int thiscode,tempcode;unsigned short temp,valueex;short codelen;BYTE hufexbyte,runsize,tempsize,sign;BYTE newbyte,lastbyte;if(BitPos1){BitPos--;thiscode(BYTE)CurByteBitPos;CurByteCurByteAnd[BitPos];}else{lastbyteReadByte();BitPos--;newbyteCurByteAnd[BitPos];thiscodelastbyte7;CurBytenewbyte;}codelen1;while ((thiscodehuf_min_value[HufTabIndex][codelen-1])||(code_len_table[HufTabIndex][codelen-1]0)||(thiscodehuf_max_value[HufTabIndex][codelen-1])){if(BitPos1){BitPos--;tempcode(BYTE)CurByteBitPos;CurByteCurByteAnd[BitPos];}else{lastbyteReadByte();BitPos--;newbyteCurByteAnd[BitPos];tempcode(BYTE)lastbyte7;CurBytenewbyte;}thiscode(thiscode1)tempcode;codelen;if(codelen16)return FUNC_FORMAT_ERROR;} //whiletempthiscode-huf_min_value[HufTabIndex][codelen-1]code_pos_table[HufTabIndex][codelen-1];hufexbyte(BYTE)code_value_table[HufTabIndex][temp];rrun(short)(hufexbyte4);runsizehufexbyte0x0f;if(runsize0){vvalue0;return FUNC_OK;}tempsizerunsize;if(BitPosrunsize){BitPos-runsize;valueex(BYTE)CurByteBitPos;CurByteCurByteAnd[BitPos];}else{valueexCurByte;tempsize-BitPos;while(tempsize8){lastbyteReadByte();valueex(valueex8)(BYTE)lastbyte;tempsize-8;} //whilelastbyteReadByte();BitPos-tempsize;valueex(valueextempsize)(lastbyteBitPos);CurBytelastbyteAnd[BitPos];} //elsesignvalueex(runsize-1);if(sign)vvaluevalueex;else{valueexvalueex^0xffff;temp0xffffrunsize;vvalue-(short)(valueex^temp);}return FUNC_OK;
}
/
void IQtIZzMCUComponent(short flag)
{short H,VV;short i,j;int *pQtZzMCUBuffer;short *pMCUBuffer;switch(flag){case 0:HSampRate_Y_H;VVSampRate_Y_V;pMCUBufferMCUBuffer;pQtZzMCUBufferQtZzMCUBuffer;break;case 1:HSampRate_U_H;VVSampRate_U_V;pMCUBufferMCUBufferY_in_MCU*64;pQtZzMCUBufferQtZzMCUBufferY_in_MCU*64;break;case 2:HSampRate_V_H;VVSampRate_V_V;pMCUBufferMCUBuffer(Y_in_MCUU_in_MCU)*64;pQtZzMCUBufferQtZzMCUBuffer(Y_in_MCUU_in_MCU)*64;break;}for(i0;iVV;i)for (j0;jH;j)IQtIZzBlock(pMCUBuffer(i*Hj)*64,pQtZzMCUBuffer(i*Hj)*64,flag);
}
//
void IQtIZzBlock(short *s ,int * d,short flag)
{short i,j;short tag;short *pQt;int buffer2[8][8];int *buffer1;short offset;switch(flag){case 0:pQtYQtTable;offset128;break;case 1:pQtUQtTable;offset0;break;case 2:pQtVQtTable;offset0;break;}for(i0;i8;i)for(j0;j8;j){tagZig_Zag[i][j];buffer2[i][j](int)s[tag]*(int)pQt[tag];}buffer1(int *)buffer2;Fast_IDCT(buffer1);for(i0;i8;i)for(j0;j8;j)d[i*8j]buffer2[i][j]offset;
}
///
void Fast_IDCT(int * block)
{short i;for (i0; i8; i)idctrow(block8*i);for (i0; i8; i)idctcol(blocki);
}
///
BYTE ReadByte()
{BYTE i;i*(lp);if(i0xff)lp;BitPos8;CurBytei;return i;
}
///
void Initialize_Fast_IDCT()
{short i;iclp iclip512;for (i -512; i512; i)iclp[i] (i-256) ? -256 : ((i255) ? 255 : i);
}void idctrow(int * blk)
{int x0, x1, x2, x3, x4, x5, x6, x7, x8;//intcutif (!((x1 blk[4]11) | (x2 blk[6]) | (x3 blk[2]) |(x4 blk[1]) | (x5 blk[7]) | (x6 blk[5]) | (x7 blk[3]))){blk[0]blk[1]blk[2]blk[3]blk[4]blk[5]blk[6]blk[7]blk[0]3;return;}x0 (blk[0]11) 128; // for proper rounding in the fourth stage //first stagex8 W7*(x4x5);x4 x8 (W1-W7)*x4;x5 x8 - (W1W7)*x5;x8 W3*(x6x7);x6 x8 - (W3-W5)*x6;x7 x8 - (W3W5)*x7;//second stagex8 x0 x1;x0 - x1;x1 W6*(x3x2);x2 x1 - (W2W6)*x2;x3 x1 (W2-W6)*x3;x1 x4 x6;x4 - x6;x6 x5 x7;x5 - x7;//third stagex7 x8 x3;x8 - x3;x3 x0 x2;x0 - x2;x2 (181*(x4x5)128)8;x4 (181*(x4-x5)128)8;//fourth stageblk[0] (x7x1)8;blk[1] (x3x2)8;blk[2] (x0x4)8;blk[3] (x8x6)8;blk[4] (x8-x6)8;blk[5] (x0-x4)8;blk[6] (x3-x2)8;blk[7] (x7-x1)8;
}
//
void idctcol(int * blk)
{int x0, x1, x2, x3, x4, x5, x6, x7, x8;//intcutif (!((x1 (blk[8*4]8)) | (x2 blk[8*6]) | (x3 blk[8*2]) |(x4 blk[8*1]) | (x5 blk[8*7]) | (x6 blk[8*5]) | (x7 blk[8*3]))){blk[8*0]blk[8*1]blk[8*2]blk[8*3]blk[8*4]blk[8*5]blk[8*6]blk[8*7]iclp[(blk[8*0]32)6];return;}x0 (blk[8*0]8) 8192;//first stagex8 W7*(x4x5) 4;x4 (x8(W1-W7)*x4)3;x5 (x8-(W1W7)*x5)3;x8 W3*(x6x7) 4;x6 (x8-(W3-W5)*x6)3;x7 (x8-(W3W5)*x7)3;//second stagex8 x0 x1;x0 - x1;x1 W6*(x3x2) 4;x2 (x1-(W2W6)*x2)3;x3 (x1(W2-W6)*x3)3;x1 x4 x6;x4 - x6;x6 x5 x7;x5 - x7;//third stagex7 x8 x3;x8 - x3;x3 x0 x2;x0 - x2;x2 (181*(x4x5)128)8;x4 (181*(x4-x5)128)8;//fourth stageblk[8*0] iclp[(x7x1)14];blk[8*1] iclp[(x3x2)14];blk[8*2] iclp[(x0x4)14];blk[8*3] iclp[(x8x6)14];blk[8*4] iclp[(x8-x6)14];blk[8*5] iclp[(x0-x4)14];blk[8*6] iclp[(x3-x2)14];blk[8*7] iclp[(x7-x1)14];
}//main( )
//{
// LoadJpegFile(test.jpg);
//} View Code xml解析我用的是TinyXml2开源库这个就不贴源码了。 关于Qt项目图标制作 我用的Qt版本是4.8.5。 步骤如下 在Qt工程目录下新建一个文本文件并将其名称改为 *.rc 名字任取将你的图标文件.ico添加到项目中 打开该 rc 文件在该rc文件里面加入以下一行文本将文本中的*换成你的图标的名字 IDI_ICON ICON DISCARDABLE *.ico 在项目文件.pro中加入以下文本将*换成你的rc文件名字 RC_FILE \ *.rc 5. 重新编译工程即可 关于Qt项目的发布 Qt项目发布最麻烦的就是动态依赖库常用的工具是hap-depends它可以查看软件的依赖库(*.dll)直接用它打开你的.exe文件查看缺失哪些.dll文件找到它们后和exe放在相同目录即可。 当然发布之前需要经过多个平台的测试。 最后祝大家生活愉快转载于:https://www.cnblogs.com/xiaoxi666/p/6544478.html