当前位置:C++技术网 > 资讯 > 图形文件的编码与解码的学习4

图形文件的编码与解码的学习4

更新时间:2015-12-15 21:16:01浏览次数:1+次

图片的编码与解密3》实现了推行文件格式的转换,下面我们将实现更复杂的图片格式转换,即再转换过程中加入对新格式的图形文件的细节控制。
同样是位图文件,但是却可能有不同类别的BMP文件,比如:8位的位图文件,16位的位图文件等。在GDI+中保存这些种类的文件时,需要在Image类
的Save函数中加入编码器参数列表信息,以确保如何保存这些文件。
JTEG文件是一种适用范围比较广泛的图形格式文件,它的特点在于使用一种有损压缩质量的方式减小图形文件的大小。对于JPEG文件压缩方式,在GDI+中可以进行控制。
void C油表View::OnGdiBmp2jpg()
{
	// TODO: 在此添加命令处理程序代码
	Graphics graphics(this->m_hWnd);
	this->RedrawWindow();
	CLSID encoderClsid;
	EncoderParameters encoderParameters;
	ULONG quality;
	Status stat;
	/////加载图片
	Image image(L"媳妇~.bmp");
	RectF rect(0, 0, image.GetWidth() / 2,image.GetHeight() / 2);
	///显示正常图片
	graphics.DrawImage(&image, rect);
	////获取JPEG格式的编码方式
	GetEncoderClsid(L"image/jpeg", &encoderClsid);
	////构造编码参数列表EncoderParameters
	////数组中只包含一个EncoderParameters对象
	encoderParameters.Count = 1;
	encoderParameters.Parameter[0].Guid = EncoderQuality;
	////参数类型为Long
	encoderParameters.Parameter[0].Type = EncoderParameterValueTypeLong;
	/////只设置一个参数
	encoderParameters.Parameter[0].NumberOfValues = 1;
	////设置JPEG图片质量为低
	quality = 0;
	encoderParameters.Parameter[0].Value = &quality;
	stat = image.Save(L"Jcos-1.jpg", &encoderClsid, &encoderParameters);
	if (stat == Ok)
	{
		Image image01(L"Jcos-1.jpg");
		////绘图平面右移
		graphics.TranslateTransform(rect.Width + 10, 0);
		graphics.DrawImage(&image01, rect);
	}
	else
	{
		AfxMessageBox(L"文件保存失败");
	}
	///设置保存JPEG图片质量为中等
	quality = 50;
	encoderParameters.Parameter[0].Value = &quality;
	stat = image.Save(L"Jcos-2.jpg", &encoderClsid, &encoderParameters);
	if (stat == Ok)
	{
		Image image02(L"Jcos-2.jpg");
		/////重置绘图平面冰下移
		graphics.ResetTransform();
		graphics.TranslateTransform(0, rect.Height + 10);
		graphics.DrawImage(&image02, rect);
	}
	else
	{
		AfxMessageBox(L"文件保存失败!");
	}
	quality = 100;
	encoderParameters.Parameter[0].Value = &quality;
	stat = image.Save(L"Jcos-3.jpg", &encoderClsid, &encoderParameters);
	if (stat == Ok)
	{
		Image image03(L"Jcos-3.jpg");
		//graphics.ResetTransform();
		graphics.TranslateTransform(rect.Width+10, 0);
		graphics.DrawImage(&image03, rect);
	}
	else
	{
		AfxMessageBox(L"文件保存失败!");
	}
}
在这里,我们需要得到函数的类标识,就需要用到之前在《图片的编码与解码2》中的代码函数getencoderclsid。

相关函数解析:

EncoderParameters:用于向图像编码器传递值或值数组。

Encoder

获取或设置与此 EncoderParameter 对象关联的 Encoder 对象。此 Encoder 对象封装全局唯一标识符 (GUID),该标识符指定存储在此 EncoderParameter 对象中的参数的类别,例如 QualityColorDepth 或 Compression

NumberOfValues

获取存储在此 EncoderParameter 对象中的值数组的元素数。

Type

获取存储在此 EncoderParameter 对象中的值的数据类型。

ValueType获取存储在此 EncoderParameter 对象中的值的数据类型。
在这里,有很多相关的函数及知识点,我之前在《图片的编码与解码1》《图片的编码与解码2》《图片的编码与解码3》里讲到了,你可以参考着学习。

最后就是代码实现: