⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gdiplushelper.cpp

📁 Windows Mobile平台上使用GDI+。GDI+功能很强大
💻 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 + -