同样是位图文件,但是却可能有不同类别的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 对象中的参数的类别,例如 Quality、ColorDepth 或 Compression。 |
NumberOfValues |
获取存储在此 EncoderParameter 对象中的值数组的元素数。 |
Type |
获取存储在此 EncoderParameter 对象中的值的数据类型。 |
在这里,有很多相关的函数及知识点,我之前在《图片的编码与解码1》《图片的编码与解码2》《图片的编码与解码3》里讲到了,你可以参考着学习。
最后就是代码实现: