递归火山软件开发平台

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 火山 源码 类库
查看: 26|回复: 2
打印 上一主题 下一主题

[视窗] 有没有图片缩放库 AI弄了个代码 错误太多了

[复制链接]

1

主题

13

帖子

69

积分

注册会员

Rank: 2

积分
69
跳转到指定楼层
楼主
发表于 昨天 21:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
<火山程序 类型 = "通常" 版本 = 1 />

类 图片字节集缩放工具 <公开 折叠>
{
    方法 缩放图片字节集 <公开 静态 类型 = 字节集类>
    参数 原图字节集 <类型 = 字节集类>
    参数 新宽度 <类型 = 整数>
    参数 新高度 <类型 = 整数>
    参数 质量 <类型 = 整数>
    {
        @ Gdiplus::GdiplusStartupInput gdiplusStartupInput;
        @ ULONG_PTR gdiplusToken;
        @ Gdiplus::GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
        @
        @ if (原图字节集.取字节集长度() == 0)
        @ {
        @     Gdiplus::GdiplusShutdown(gdiplusToken);
        @     return 字节集类();
        @ }
        @
        @ // 创建内存流
        @ IStream* pStream = NULL;
        @ HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, 原图字节集.取字节集长度());
        @ if (hGlobal == NULL)
        @ {
        @     Gdiplus::GdiplusShutdown(gdiplusToken);
        @     return 字节集类();
        @ }
        @
        @ void* pData = GlobalLock(hGlobal);
        @ if (pData == NULL)
        @ {
        @     GlobalFree(hGlobal);
        @     Gdiplus::GdiplusShutdown(gdiplusToken);
        @     return 字节集类();
        @ }
        @
        @ memcpy(pData, 原图字节集.取指针(), 原图字节集.取字节集长度());
        @ GlobalUnlock(hGlobal);
        @
        @ if (CreateStreamOnHGlobal(hGlobal, TRUE, &pStream) != S_OK)
        @ {
        @     GlobalFree(hGlobal);
        @     Gdiplus::GdiplusShutdown(gdiplusToken);
        @     return 字节集类();
        @ }
        @
        @ // 从流加载图片
        @ Gdiplus::Bitmap* srcImage = Gdiplus::Bitmap::FromStream(pStream);
        @ if (srcImage == NULL || srcImage->GetLastStatus() != Gdiplus::Ok)
        @ {
        @     pStream->Release();
        @     Gdiplus::GdiplusShutdown(gdiplusToken);
        @     return 字节集类();
        @ }
        @
        @ // 创建目标位图
        @ Gdiplus::Bitmap* dstBitmap = new Gdiplus::Bitmap(新宽度, 新高度, srcImage->GetPixelFormat());
        @ Gdiplus::Graphics graphics(dstBitmap);
        @
        @ // 设置高质量缩放
        @ graphics.SetInterpolationMode(Gdiplus::InterpolationModeHighQualityBicubic);
        @ graphics.SetSmoothingMode(Gdiplus::SmoothingModeHighQuality);
        @
        @ // 绘制缩放图片
        @ graphics.DrawImage(srcImage, 0, 0, 新宽度, 新高度);
        @
        @ // 保存到内存流
        @ IStream* pOutStream = NULL;
        @ CreateStreamOnHGlobal(NULL, TRUE, &pOutStream);
        @
        @ 字节集类 结果字节集;
        @
        @ if (pOutStream != NULL)
        @ {
        @     CLSID clsid;
        @     if (获取编码器CLSID(L"image/jpeg", &clsid))
        @     {
        @         Gdiplus::EncoderParameters encoderParams;
        @         encoderParams.Count = 1;
        @         encoderParams.Parameter[0].Guid = Gdiplus::EncoderQuality;
        @         encoderParams.Parameter[0].Type = Gdiplus::EncoderParameterValueTypeLong;
        @         encoderParams.Parameter[0].NumberOfValues = 1;
        @         encoderParams.Parameter[0].Value = &质量;
        @
        @         if (dstBitmap->Save(pOutStream, &clsid, &encoderParams) == Gdiplus::Ok)
        @         {
        @             // 获取流数据
        @             STATSTG stat;
        @             pOutStream->Stat(&stat, STATFLAG_NONAME);
        @
        @             HGLOBAL hGlobalOut;
        @             GetHGlobalFromStream(pOutStream, &hGlobalOut);
        @
        @             void* pDataOut = GlobalLock(hGlobalOut);
        @             if (pDataOut != NULL)
        @             {
        @                 结果字节集.分配(stat.cbSize.LowPart);
        @                 memcpy(结果字节集.取指针(), pDataOut, stat.cbSize.LowPart);
        @                 GlobalUnlock(hGlobalOut);
        @             }
        @         }
        @         pOutStream->Release();
        @     }
        @ }
        @
        @ delete srcImage;
        @ delete dstBitmap;
        @ pStream->Release();
        @ Gdiplus::GdiplusShutdown(gdiplusToken);
        @
        @ return 结果字节集;
    }

    方法 获取编码器CLSID <静态 类型 = 逻辑型 折叠>
    参数 格式 <类型 = 文本型>
    参数 pClsid <类型 = 变整数>
    {
        @ UINT num = 0;
        @ UINT size = 0;
        @ Gdiplus::GetImageEncodersSize(&num, &size);
        @ if (size == 0)
        @ {
        @     return false;
        @ }
        @
        @ Gdiplus::ImageCodecInfo* pImageCodecInfo = (Gdiplus::ImageCodecInfo*)malloc(size);
        @ if (pImageCodecInfo == NULL)
        @ {
        @     return false;
        @ }
        @
        @ Gdiplus::GetImageEncoders(num, size, pImageCodecInfo);
        @
        @ for (UINT j = 0; j < num; ++j)
        @ {
        @     if (wcscmp(pImageCodecInfo[j].MimeType, 格式.取文本()) == 0)
        @     {
        @         *((CLSID*)pClsid) = pImageCodecInfo[j].Clsid;
        @         free(pImageCodecInfo);
        @         return true;
        @     }
        @ }
        @
        @ free(pImageCodecInfo);
        @ return false;
    }
}


回复

使用道具 举报

3

主题

115

帖子

1669

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
1669
沙发
发表于 2 小时前 | 只看该作者
论坛里面找一下GDI库  zyGdiplus
回复

使用道具 举报

3

主题

115

帖子

1669

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
1669
板凳
发表于 2 小时前 | 只看该作者
论坛里面找一下GDI库  zyGdiplus
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|递归火山软件开发平台 ( 鄂ICP备18029190号 )

GMT+8, 2025-11-13 05:36 , Processed in 0.084502 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表