ImageFun 使JPG的缩略图跟原图不一样 (刷微博必备)

1.做这个软件起因


最近在微博上见到很多这样的游戏:


ImageFun 使JPG的缩略图跟原图不一样 (刷微博必备)_第1张图片


一般有9个位置,点开后可以看到原图的样子,比如我点击了9,就会显示原图:


ImageFun 使JPG的缩略图跟原图不一样 (刷微博必备)_第2张图片


我觉得非常的神奇,想了下应该是缩略图跟原图不一样造成的。查了下,发现一个软件叫Exifer可以实现这样的效果,但是那个软件非常难用,失败率很高,然后我用MFC做了

一个软件叫ImageFun,专门做这个效果。


2.ImageFun软件下载地址:


http://www.waitingfy.com/archives/931/imagefun1

3.ImageFun效果图:


ImageFun 使JPG的缩略图跟原图不一样 (刷微博必备)_第3张图片


使用方法,就是选择两张图,然后点击生成新图,就会选择一个目录,图就生成完毕了。


4.背后的原理


4.1修改Exif中的缩略图


有兴趣想知道背后原理的,可以继续往下看了。

刚开始为了到达这样的效果做了一个软件主要就是修改了Exif的缩略图,什么是Exif呢?Exif格式就是在JPEG格式头部插入了数码照片的信息,包括拍摄时的光圈、快门、白平衡、ISO、焦距、日期时间等各种和拍摄条件以及相机品牌、型号、色彩编码、拍摄时录制的声音以及全球定位系统(GPS)、缩略图等。


有很多C的开源库可以实现这样的效果,但是我不懂C语言啊,最后找了一个C++的库叫Exiv2, Exiv2 is a C++ library and a command line utility to manage image metadata.


核心代码就几句话:

1.载入图片

2.修改缩略图


void CProduceImgDlg::ChangeThumb(CString desPath, CString thumbPath){
	try {

		Exiv2::Image::AutoPtr image = Exiv2::ImageFactory::open(desPath.GetBuffer(0));
		assert(image.get() != 0);
		image->readMetadata();

		Exiv2::ExifData &exifData = image->exifData();
		Exiv2::ExifThumb thumb = Exiv2::ExifThumb(exifData);
		thumb.setJpegThumbnail(thumbPath.GetBuffer(0));
		image->writeMetadata();
	}
	catch (Exiv2::AnyError& e) {
		//std::cout << "Caught Exiv2 exception '" << e.what() << "'\n";
	}
}

等我做了一张图片上传到微博上的时候,发现不行了!在电脑上浏览非常正常的JPG上传微博就不行了,发现是被微博压缩了。

只能换个思路了?


修改JPG的 ImageFun 下载地址:

http://www.waitingfy.com/archives/931/imagefun


4.2生成只有两帧的Gif


想了下应该是gif图片格式,然后把第二帧的时间设置格外长,下载了微博上其他人做的图片,放到UleadGIFAnimator中看了下发现确实是这样的:


ImageFun 使JPG的缩略图跟原图不一样 (刷微博必备)_第4张图片


UleadGIFAnimator能很轻松的制作gif,都想放弃做这个ImageFun软件了。硬着头皮做完算了。

找了下能生成Gif图片的C++类库,比较出名的是CxImage.


它里面的一个生成gif例子是这样的:


CxImage ima1,ima2;
	ima1.Load("c://walle.jpg");
	ima2.Load("c://otherPhone2.jpg");


	ima1.DecreaseBpp(8,false,0,0);
	ima2.DecreaseBpp(8,false,0,0);
	ima1.SetTransIndex(ima1.GetPixelIndex(0,0));
	ima2.SetTransIndex(ima2.GetPixelIndex(0,0));


	ima1.SetFrameDelay(10);
	ima2.SetFrameDelay(20000);

	CxImage *pimage[2];
    pimage[0] = &ima1;
	pimage[1] = &ima2;

	CxIOFile hFile;
	hFile.Open(_T("c://ani.gif"),_T("wb"));

	CxImageGIF multiimage;
	multiimage.SetComment("CxImage demo");
	multiimage.SetLoops(3);
	multiimage.SetDisposalMethod(2);
	multiimage.Encode(&hFile,pimage,2,false,false);

	hFile.Close();

记得一定要调用DecreaseBpp函数,不知道为什么只支持8,搞的最终的gif图片效果很差,就放弃使用CxImage了,不过CxImage真的很强大,以后可以用下。


后来就用了某个大神做的 “制作动画GIF的VC源代码”,下载地址: http://download.csdn.net/detail/iamshuke/2567835


就这样发布了最终的ImageFun.


http://www.waitingfy.com/archives/931

5.支持作者

淘宝购买源码,或者援助:地址

ImageFun 使JPG的缩略图跟原图不一样 (刷微博必备)_第5张图片



你可能感兴趣的:(ImageFun 使JPG的缩略图跟原图不一样 (刷微博必备))