欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 产业 > Windows 图像处理组件(WIC)读写位深度24位的 bmp 文件

Windows 图像处理组件(WIC)读写位深度24位的 bmp 文件

2025/6/22 14:25:11 来源:https://blog.csdn.net/m0_72776207/article/details/139870982  浏览:    关键词:Windows 图像处理组件(WIC)读写位深度24位的 bmp 文件

我写了类封装了一下。只是作业需要,缺少错误处理。

#include <wincodec.h>enum PixColor { B, G, R };struct ComEnv {ComEnv(){CoInitialize(nullptr);CoCreateInstance(CLSID_WICImagingFactory, nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&fac));}~ComEnv(){fac->Release();CoUninitialize();}static IWICImagingFactory* fac;
}g_comEnvDummy;
IWICImagingFactory* ComEnv::fac;// 位深度为 24,BGR 格式的 bmp 文件
struct ImgDec {ImgDec(LPCWSTR fname){ComEnv::fac->CreateDecoderFromFilename(fname, nullptr, GENERIC_READ, WICDecodeMetadataCacheOnDemand, &dec);dec->GetFrame(0, &fram);ComEnv::fac->CreateBitmapFromSource(fram, WICBitmapCacheOnDemand, &bmp);bmp->GetSize(&w, &h);WICRect rc = { .X = 0, .Y = 0, .Width = (INT)w, .Height = (INT)h };bmp->Lock(nullptr, WICBitmapLockRead, &lck);lck->GetStride(&stride);lck->GetDataPointer(&bufsiz, &v);}BYTE& operator()(int i, int j, PixColor c){BYTE* row = v + (UINT64)i * stride;BYTE* p = row + 3ull * j;return p[c];}void saveAs(LPCWSTR newName){IWICStream* str;ComEnv::fac->CreateStream(&str);str->InitializeFromFilename(newName, GENERIC_WRITE);IWICBitmapEncoder* enc;ComEnv::fac->CreateEncoder(GUID_ContainerFormatBmp, nullptr, &enc);enc->Initialize(str, WICBitmapEncoderNoCache);IWICBitmapFrameEncode* fram;IPropertyBag2* opt = nullptr;enc->CreateNewFrame(&fram, &opt); // opt 既是入参也是出参// 现在 opt 是默认选项fram->Initialize(opt);fram->SetSize(w, h);WICPixelFormatGUID fmt = GUID_WICPixelFormat24bppBGR;fram->SetPixelFormat(&fmt);fram->WritePixels(h, stride, h * stride, v);fram->Commit();enc->Commit();fram->Release();opt->Release();enc->Release();str->Release();}~ImgDec(){lck->Release();bmp->Release();fram->Release();dec->Release();}IWICBitmapDecoder* dec;IWICBitmapFrameDecode* fram;IWICBitmap* bmp;IWICBitmapLock* lck;UINT w, h;UINT stride;UINT bufsiz;BYTE* v;
};

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词