📄 gdiplushelper.cpp
字号:
#include "stdafx.h"
#include "GdiplusHelper.h"
static
int BytesPerLine(int nWidth, int nBitsPerPixel)
{
return ( (nWidth * nBitsPerPixel + 31) & (~31) ) / 8;
}
/////////////////////
// GetEncoderClsid : retrieve clsid from mime type
bool GetEncoderClsid(IImagingFactory* pImgFactory, const WCHAR* lpMimeType, CLSID* pClsid)
{
if (!pImgFactory || !lpMimeType)
return FALSE;
UINT count;
ImageCodecInfo* imageCodecInfo=NULL;
int i;
if (pImgFactory->GetInstalledEncoders(&count, &imageCodecInfo) == S_OK) {
for (i = 0; i < count; i++)
{
if (_tcsicmp(lpMimeType, imageCodecInfo[i].MimeType) == 0)
{
*pClsid = imageCodecInfo[i].Clsid;
break;
}
}
}
CoTaskMemFree(imageCodecInfo);
return (i <count) ? true : false;
}
bool GdiplusSaveBitmap(IImagingFactory* pImgFactory,
Gdiplus::Bitmap* pBitmap,
LPCTSTR lpFileName,
CLSID* pClsid)
{
if (!pImgFactory || !pBitmap || !lpFileName || !pClsid)
return false;
// We fill ImageInfo for BeginSink
Gdiplus::Status status;
HRESULT hr;
Gdiplus::REAL Xdpi;
Gdiplus::REAL Ydpi;
ImageInfo imginfo = {0};
imginfo.PixelFormat = pBitmap->GetPixelFormat();
imginfo.Width = pBitmap->GetWidth();
imginfo.Height = pBitmap->GetHeight();
Xdpi = pBitmap->GetHorizontalResolution();
imginfo.Xdpi = Xdpi;
Xdpi = pBitmap->GetVerticalResolution();
imginfo.Ydpi = Ydpi;
imginfo.RawDataFormat = ImageFormatMemoryBMP;
imginfo.Flags |= SinkFlagsTopDown | SinkFlagsFullWidth;
if (IsAlphaPixelFormat(imginfo.PixelFormat))
imginfo.Flags |= SinkFlagsHasAlpha;
//WORD bmBitsPixel = GetPixelFormatSize( bitmap.GetPixelFormat() );
// Needs to play between GDI Rect and Gdiplus::Rect
RECT rect;
Rect gdiprect;
rect.top = gdiprect.Y = 0;
rect.bottom = gdiprect.Height = imginfo.Height;
rect.left = gdiprect.X = 0;
rect.right = gdiprect.Width = imginfo.Width;
BitmapData bmpdata;
IImageEncoder* imageEncoder=NULL;
hr = pImgFactory->CreateImageEncoderToFile(pClsid, lpFileName, &imageEncoder);
if ( hr == S_OK) {
IImageSink* imageSink = NULL;
hr = imageEncoder->GetEncodeSink(&imageSink);
if (hr == S_OK) {
if (imageSink->BeginSink(&imginfo, NULL) == S_OK) {
ColorPalette* palette = NULL;
if( IsIndexedPixelFormat( imginfo.PixelFormat ) )
{
INT nPaletteSize;
nPaletteSize = pBitmap->GetPaletteSize();
palette = static_cast< ColorPalette* >( malloc( nPaletteSize ) );
status = pBitmap->GetPalette(palette, nPaletteSize);
if (status == Ok)
{
for( UINT iColor = 0; iColor < palette->Count; iColor++ )
{
palette->Entries[iColor]= Color::MakeARGB(255,iColor ,iColor ,iColor );
}
}
}
if (palette != NULL)
{
if (imginfo.PixelFormat == PixelFormat32bppARGB)
palette->Flags = PALFLAG_HASALPHA;
hr = imageSink->SetPalette(palette);
}
status = pBitmap->LockBits(&gdiprect, ImageLockModeRead,imginfo.PixelFormat, &bmpdata);
if (status == Ok)
{
if (bmpdata.Stride < 0)
{
bmpdata.Stride = bmpdata.Stride * -1;
int biBitCount = GetPixelFormatSize(bmpdata.PixelFormat);
DWORD biSizeImage = BytesPerLine(bmpdata.Width, biBitCount) * bmpdata.Height;
bmpdata.Scan0 = (void*) ( ((DWORD)bmpdata.Scan0 + bmpdata.Stride) - biSizeImage);
}
hr = imageSink->PushPixelData(&rect, &bmpdata, TRUE);
status = pBitmap->UnlockBits(&bmpdata);
hr = imageSink->EndSink(S_OK);
}
if (palette)
free(palette);
imageEncoder->TerminateEncoder();
imageEncoder->Release();
imageSink->Release();
}
}
}
return (hr == S_OK) ? Ok : GenericError;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -