2 回答
TA贡献1873条经验 获得超9个赞
除非jpeg的宽度和高度都是16的倍数,否则无法这样做。如果在GDI+中进行此操作,并且宽度和高度不是16的倍数,GDI+将尽最大努力保持压缩质量相同。在.net中也是一样
请注意,您的 GDI+ 代码只会旋转缩略图。要旋转图像,请使用以下代码:
void RotateImage()
{
//new/delete operator is not necessary, unless
//Gdiplus startup/shutdown is in the same scope
Gdiplus::Image image(L"source.jpg");
if((image.GetWidth() % 16) != 0 || (image.GetHeight() % 16) != 0)
wprintf(L"Lossless compression is not possible\n");
Gdiplus::EncoderParameters encoder_params;
encoder_params.Count = 1;
encoder_params.Parameter[0].Guid = Gdiplus::EncoderTransformation;
encoder_params.Parameter[0].Type = Gdiplus::EncoderParameterValueTypeLong;
encoder_params.Parameter[0].NumberOfValues = 1;
//rotate
ULONG transformation = Gdiplus::EncoderValueTransformRotate90;
encoder_params.Parameter[0].Value = &transformation;
CLSID clsid;
GetEncoderClsid(L"image/jpeg", &clsid);
auto stat = image.Save(L"destination.jpg", &clsid, &encoder_params);
wprintf(L"Save %s\n", (stat == Gdiplus::Ok) ? L"succeeded" : L"failed");
}
int main()
{
Gdiplus::GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
RotateImage();
Gdiplus::GdiplusShutdown(gdiplusToken);
return 0;
}
TA贡献1836条经验 获得超5个赞
以编程方式执行此操作的方法是读取 SOS 市场之后应出现的 APP1 标记。获取标记结构的 JPEG 文档。
拥有 APP1 标记后,您需要根据需要更改方向。
然后将 SOS 标记、修改后的 APP1 标记以及 APP1 标记之后的其余 JPEG 流写入新文件。
这就是他们的全部。唯一的复杂性是导航 EXIF 文档以进行方向设置。
- 2 回答
- 0 关注
- 193 浏览
添加回答
举报