ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

freeimage 动态验证码tif解析成静态jpg

2020-01-20 15:02:29  阅读:332  来源: 互联网

标签:Load cout freeimage dib FreeImage int fif jpg tif


这函数功能是输入一个路径名,返回解析到的图片 然后存放到一个vector里面
解决了网上代码 内存泄漏 问题。修改了代码结构,修复了大数据量调用崩溃的情况

#include<opencv.hpp>


using namespace cv;
using namespace std;


Mat Gif_To_Mat(FIBITMAP* fiBmp, const FREE_IMAGE_FORMAT fif);
void FreeImageErrorHandler(FREE_IMAGE_FORMAT fif, const char *message);
bool Gif_Load(const string &filename,  vector<Mat>& res);
bool Jpg_To_Video();
bool Show_Video();

unsigned char bpp;
BYTE *bits;
bool Load_flag;
int width;
int height;
FREE_IMAGE_FORMAT fif = FIF_UNKNOWN;
Mat Src_Gif;


int _tmain(int argc, _TCHAR* argv[])
{
	//FreeImage_Initialise();
	using clock = std::chrono::system_clock;
	using ms = std::chrono::milliseconds;
	const auto before = clock::now();
	cv::String gyLabelFP = "F:/cppcode/cpptest/verifi_code/path.txt";//图片列表路径
	ifstream infile;;
	string line;
	infile.open(gyLabelFP);   //将文件流对象与文件连接起来 
	/*cout << labelFP << endl;*/


	while (getline(infile, line))
	{

		String gif_path = line;
		vector<Mat>res;
		for (int i = 0; i < 2000; i++)
		{
			Load_flag = Gif_Load(gif_path, res);

			if (Load_flag == TRUE)
			{
				//Jpg_To_Video();
				////Show_Video();
				cout << "load file successful!" << endl;

			}
			cout << i << endl;
		}
	}

	//FreeImage_DeInitialise();
	const auto duration = std::chrono::duration_cast<ms>(clock::now() - before);
	
	std::cout << duration.count() << "ms" << std::endl;
	
	return 0;
}

bool Gif_Load(const string &filename,vector<Mat>&res)
{
	FreeImage_Initialise();
	FIBITMAP *dib = 0;
	FIMULTIBITMAP *bitmap = 0;
	FIBITMAP * pFrame;

	fif = FreeImage_GetFileType(filename.c_str(), 0);
	if (fif == FIF_UNKNOWN)						
		fif = FreeImage_GetFIFFromFilename(filename.c_str());
	if (fif == FIF_UNKNOWN)						
		return false;
	if (FreeImage_FIFSupportsReading(fif))		
		dib = FreeImage_Load(fif, filename.c_str());
	if (!dib)									
		return false;//dib Load failed	

	//bpp = FreeImage_GetBPP(dib);
	//bits = (BYTE*)FreeImage_GetBits(dib);
	width = FreeImage_GetWidth(dib);
	height = FreeImage_GetHeight(dib);

	cout << "Load The File:   " << filename.c_str()  << endl;
	cout << "The File's width: " << width << endl;
	cout << "The File's height: " << height << endl;

	//if ((bits == 0) || (width == 0) || (height == 0))		return false;

	bitmap = FreeImage_OpenMultiBitmap(fif, filename.c_str(), 0, 0, 1, GIF_DEFAULT);
	if (bitmap == NULL)
	{ 
		cout << "BitMap == Null" << endl;
		return FALSE;
	}
	
	int count = FreeImage_GetPageCount(bitmap);//获取帧数;

	for (int i = 0; i <count; i++)
	{
		pFrame = FreeImage_LockPage(bitmap, i);
		//cout << "pFrame:" << pFrame << endl;
		Src_Gif = Gif_To_Mat(pFrame, fif);
		res.push_back(Src_Gif);
		string fold = "F:/cppcode/cpptest/data/";
		string Src_Gif_Name = to_string(i);
		
		imwrite(fold + Src_Gif_Name + ".jpg", Src_Gif);
		FreeImage_UnlockPage(bitmap, pFrame, 1);
	}
	BOOL  bSuccess = FreeImage_CloseMultiBitmap(bitmap, 0);
	if (!bSuccess)
	{
		return FALSE;
	}
	FreeImage_Unload(dib);
	FreeImage_DeInitialise();
	Load_flag = TRUE;
	return Load_flag;
}

Mat Gif_To_Mat(FIBITMAP* fiBmp, const FREE_IMAGE_FORMAT fif)
{
	if (fiBmp == NULL || fif != FIF_GIF)
	{
		return Mat();
	}

	//int width = FreeImage_GetWidth(fiBmp);
	//int height = FreeImage_GetHeight(fiBmp);
	
	BYTE intensity;
	BYTE* PIintensity = &intensity;
	if (FreeImage_GetBPP(fiBmp) != 8)
		fiBmp = FreeImage_ConvertTo8Bits(fiBmp);

	//RGBQUAD* pixels = new RGBQUAD;
	RGBQUAD* pixels = FreeImage_GetPalette(fiBmp);

	Mat img = Mat::zeros(height, width, CV_8UC3);

	uchar *p;

	for (int i = 0; i < height; i++)
	{
		p = img.ptr<uchar>(i);
		for (int j = 0; j < width; j++)
		{
			FreeImage_GetPixelIndex(fiBmp, j, height - i, PIintensity);//height - i
			p[3 * j] = pixels[intensity].rgbBlue;
			p[3 * j + 1] = pixels[intensity].rgbGreen;
			p[3 * j + 2] = pixels[intensity].rgbRed;
		}
	}

	return img;
}

在这里插入图片描述
在这里插入图片描述

u010654302 发布了1 篇原创文章 · 获赞 0 · 访问量 10 私信 关注

标签:Load,cout,freeimage,dib,FreeImage,int,fif,jpg,tif
来源: https://blog.csdn.net/u010654302/article/details/104051662

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有