細かい事を気にしてはいけない。
Windowscodecs.lib, Shlwapi.lib をリンクすること。
#include <Windows.h>
#include <comdef.h>
#include <wincodec.h>
#include <Shlwapi.h>
_COM_SMARTPTR_TYPEDEF(IWICImagingFactory, __uuidof(IWICImagingFactory));
_COM_SMARTPTR_TYPEDEF(IWICBitmapDecoder, __uuidof(IWICBitmapDecoder));
_COM_SMARTPTR_TYPEDEF(IWICBitmapFrameDecode, __uuidof(IWICBitmapFrameDecode));
_COM_SMARTPTR_TYPEDEF(IWICBitmapSource, __uuidof(IWICBitmapSource));
_COM_SMARTPTR_TYPEDEF(IStream, __uuidof(IStream));
_COM_SMARTPTR_TYPEDEF(IWICBitmapEncoder, __uuidof(IWICBitmapEncoder));
_COM_SMARTPTR_TYPEDEF(IWICBitmapFrameEncode, __uuidof(IWICBitmapFrameEncode));
HRESULT read(void **ppData, UINT *pWidth, UINT *pHeight, LPCWSTR pName)
{
IWICImagingFactoryPtr pFactory;
IWICBitmapDecoderPtr pDecoder;
IWICBitmapFrameDecodePtr pFrame;
IWICBitmapSourcePtr pBitmap;
UINT stride;
UINT size;
pFactory.CreateInstance(CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER);
pFactory->CreateDecoderFromFilename(pName, NULL, GENERIC_READ, WICDecodeMetadataCacheOnDemand, &pDecoder);
pDecoder->GetFrame(0, &pFrame);
WICConvertBitmapSource(GUID_WICPixelFormat32bppBGR, pFrame, &pBitmap); //DIB section compatible
pBitmap->GetSize(pWidth, pHeight);
stride = 4 * *pWidth;
size = stride * *pHeight;
*ppData = new BYTE[size];
pBitmap->CopyPixels(NULL, stride, size, (BYTE *)*ppData);
return S_OK;
}
HRESULT writeBmp(LPCWSTR pName, void *pData, UINT width, UINT height)
{
IWICImagingFactoryPtr pFactory;
IWICBitmapEncoderPtr pEncoder;
IStreamPtr pStream;
IWICBitmapFrameEncodePtr pFrame;
WICPixelFormatGUID guidFormat;
pFactory.CreateInstance(CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER);
pFactory->CreateEncoder(GUID_ContainerFormatBmp, NULL, &pEncoder);
SHCreateStreamOnFileEx(pName, STGM_READWRITE| STGM_CREATE, FILE_ATTRIBUTE_NORMAL, TRUE, NULL, &pStream);
pEncoder->Initialize(pStream, WICBitmapEncoderNoCache);
pEncoder->CreateNewFrame(&pFrame, NULL);
pFrame->Initialize(NULL);
guidFormat = GUID_WICPixelFormat32bppBGR;
pFrame->SetPixelFormat(&guidFormat);
pFrame->SetSize(width, height);
pFrame->WritePixels(height, 4*width, 4*width*height, (BYTE *)pData);
pFrame->Commit();
pEncoder->Commit();
return S_OK;
}
0 件のコメント:
コメントを投稿