按照GDI+的开发文档,GDI+保证在对JPEG图片进行下列变换时,JPEG图片的质量保持不变,这些变换是:
图片旋转90°
图片旋转270°
图片旋转180°
水平翻转
垂直翻转
程序开发人员可使用Image类的成员函数Save保存JPEG文件前,进行上述的任何一种变换,JPEG的质量不会受到丝毫的影响。另外,如果满足下面的两个条件,JPEG图片也不会因为变换而降低质量
使用JPEG图片构造Image对象
JPEG图片的高度和宽度均为16的整数倍
当JPEG文件的宽度和高度均不是16的整数倍的时候,在进行图片的变换时,GDI+将会尽量的保护JPEG的
信息不至于丢失
如果要将变换信息保存在JPEG文件中,关键是在编码参数中进行变换的说明,编码参数的定制是通过向
EncoderParameters对象传送参数信息来完成的,所有的参数信息都将直接影响Image类的Save成员函数
对JPEG的保存信息
EncoderParameters的主要成员是EncoderParameter对象,在对EncoderParameter初始化的过程中,可以
直接申明进行图片的简单变换,申明的方法
EncoderValueTransformRotate90;
EncoderValueTransformRotate180;
EncoderValueTransformRotate270;
EncoderValueTransformRotateFlipHorizontal;
EncoderValueTransformRotateFlipVertical;
代码实现图片的转换及旋转:
void C油表View::OnGdiTransformingjpeg()
{
// TODO: 在此添加命令处理程序代码
Graphics graphics(this->m_hWnd);
this->RedrawWindow();
CLSID encoderClsid;
EncoderParameters encoderParameters;
ULONG transformation;
Status stat;
/////加载图片
Image image(L"媳妇~.bmp");
RectF rect(0, 0, image.GetWidth(), image.GetHeight());
///显示正常图片
graphics.DrawImage(&image, rect);
////获取JPEG格式的编码方式
GetEncoderClsid(L"image/jpeg", &encoderClsid);
////构造编码参数列表EncoderParameters
////数组中只包含一个EncoderParameters对象
encoderParameters.Count = 1;
encoderParameters.Parameter[0].Guid = EncoderTransformation;
////参数类型为Long
encoderParameters.Parameter[0].Type = EncoderParameterValueTypeLong;
/////只设置一个参数
encoderParameters.Parameter[0].NumberOfValues = 1;
transformation = EncoderValueTransformRotate90;
encoderParameters.Parameter[0].Value = &transformation;
stat = image.Save(L"cos2.jpg", &encoderClsid, &encoderParameters);
if (stat == Ok)
{
Image image01(L"cos2.jpg");
graphics.TranslateTransform(rect.Width + 10, 0);
graphics.DrawImage(&image01, rect);
}
else
{
AfxMessageBox(L"文件保存失败!");
}
}