zoukankan      html  css  js  c++  java
  • Direct2D WIC绘制图片

    绘制图片需要用到WIC,WIC的功能包括:
    • 编解码图片。也可以自定义图片解码插件。
    • 读取图片元数据。
    • 图像处理(最高支持每通道32位)。
    • 内置支持一些流行的格式。包括:BMP v5, GIF 89a/m, ICO, JPEG, PNG 1.2, TIFF 6.0, Windows Media Photo.
    WIC绘制图片是在GPU上进行的,所以效率较高

    这里写一个简单的读取图片的例子,别忘了添加头文件:

    #include "wincodec.h"

    以及wic的Lib
    windowscodecs.lib;
    下面的是d2d必须的
    d2d1.lib;
    dxgi.lib;
    dxguid.lib;

    显示图片的流程如下:
    1. 初始化IWICImagingFactory的对象。
    2. IWICImagingFactory创建解码器。
    3. 打开文件,并获取一帧。
    4. 转码。
    5. 初始化。
    6. 创建图片。
    7. 绘制图片。

    pRenderTarget->BeginDraw();
    
    	//clear screen
    	pRenderTarget->Clear(D2D1::ColorF(D2D1::ColorF::White));
    
    	IWICImagingFactory* pIWICFactory = NULL;
    	IWICBitmapDecoder* pDecoder = NULL;
    	IWICBitmapFrameDecode* pFrame = NULL;
    	IWICFormatConverter* pConverter = NULL;
    	ID2D1Bitmap* pBitmap = NULL;
    
    	CoCreateInstance(CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pIWICFactory) );
    
    	//create a decoder
    	hr = pIWICFactory->CreateDecoderFromFilename(
    		TEXT("C:\Users\NET45.png"),
    		NULL,
    		GENERIC_READ,
    		WICDecodeMetadataCacheOnLoad,
    		&pDecoder
    		);
    
    	// Create the initial frame.
    	hr = pDecoder->GetFrame(0, &pFrame);
    
    	// Format convert the frame to 32bppPBGRA
    	hr = pIWICFactory->CreateFormatConverter(&pConverter);
    
    	//Initialize Converter
    	hr = pConverter->Initialize(
    		pFrame,                          // Input bitmap to convert
    		GUID_WICPixelFormat32bppPBGRA,   // Destination pixel format
    		WICBitmapDitherTypeNone,         // Specified dither pattern
    		NULL,                            // Specify a particular palette 
    		0.f,                             // Alpha threshold
    		WICBitmapPaletteTypeCustom       // Palette translation type
    		);
    
    	// create Bitmap
    	hr = pRenderTarget->CreateBitmapFromWicBitmap(
    		pConverter,
    		NULL,
    		&pBitmap
    		);
    
    	//get bimap size
    	D2D1_SIZE_F size = pBitmap->GetSize() ;
    	D2D1_POINT_2F upperLeftCorner = D2D1::Point2F(0.f, 0.f) ;
    
    	//draw bitmap
    	pRenderTarget->DrawBitmap(
    		pBitmap,
    		D2D1::RectF(
    		upperLeftCorner.x,
    		upperLeftCorner.y,
    		upperLeftCorner.x + size.width,
    		upperLeftCorner.y + size.height)
    		) ;
    
    	pRenderTarget->EndDraw();

    关于WIC的详细介绍可以参考MSDN:
  • 相关阅读:
    Objective-c 语法,类/属性/函数(iOS学习笔记,从零开始。)
    设置UIButton 对齐方式
    iOS Runtime[转载]
    使用带粒子效果的 CAEmitterLayer
    使用maskView设计动画效果
    url、href、src 详解
    良好的JavaScript编码风格(语法规则)
    关于闭包
    盒子模型详解
    git入门笔记汇总——(廖雪峰博客git入门)
  • 原文地址:https://www.cnblogs.com/aukle/p/3223717.html
Copyright © 2011-2022 走看看