Direct2d , WICBITMAP
来源:互联网 发布:翁虹 三级 知乎 编辑:程序博客网 时间:2024/05/23 19:14
Direct2d , WICBITMAP
private: ID2D1Factory* m_pDirect2dFactory; ID2D1HwndRenderTarget* m_pRenderTarget; ID2D1SolidColorBrush* m_pLightSlateGrayBrush; ID2D1SolidColorBrush* m_pCornflowerBlueBrush; ID2D1Bitmap* m_pD2d1Bitmap; IWICBitmap* m_pWicBitmap; IWICImagingFactory* m_pWicImagingFactory; IWICBitmapDecoder* m_pWicDecoder; IWICBitmapFrameDecode* m_pWicFrameDecoder;// Initialize device-indpendent resources, such
// as the Direct2D factory.
HRESULT DemoApp::CreateDeviceIndependentResources(){ HRESULT hr = S_OK; // Create a Direct2D factory. hr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &m_pDirect2dFactory); hr = CoCreateInstance(CLSID_WICImagingFactory,nullptr,CLSCTX_INPROC_SERVER,IID_PPV_ARGS(&m_pWicImagingFactory)); return hr;}
if(m_pWicImagingFactory != nullptr){ m_pWicImagingFactory->CreateDecoderFromFilename(L"1.jpg",nullptr,GENERIC_READ,WICDecodeMetadataCacheOnDemand,&m_pWicDecoder); m_pWicDecoder->GetFrame(0,&m_pWicFrameDecoder); IWICBitmapSource* pWicSource = nullptr; m_pWicFrameDecoder->QueryInterface(IID_PPV_ARGS(&pWicSource)); IWICFormatConverter* pCovert = nullptr; // Convert the image format to 32bppPBGRA // (DXGI_FORMAT_B8G8R8A8_UNORM + D2D1_ALPHA_MODE_PREMULTIPLIED). m_pWicImagingFactory->CreateFormatConverter(&pCovert); hr = pCovert->Initialize( pWicSource, GUID_WICPixelFormat32bppPBGRA, WICBitmapDitherTypeNone, NULL, 0.f, WICBitmapPaletteTypeCustom ); m_pWicImagingFactory->CreateBitmapFromSource(pCovert,WICBitmapCacheOnDemand,&m_pWicBitmap); SafeRelease(&pCovert); UINT pixelWidth = 0,pixelHeight = 0; m_pWicBitmap->GetSize(&pixelWidth,&pixelHeight);}
HRESULT DemoApp::CreateDeviceResources(){ HRESULT hr = S_OK; if (!m_pRenderTarget) { RECT rc; GetClientRect(m_hwnd, &rc); D2D1_SIZE_U size = D2D1::SizeU( rc.right - rc.left, rc.bottom - rc.top ); // Create a Direct2D render target. hr = m_pDirect2dFactory->CreateHwndRenderTarget( D2D1::RenderTargetProperties(), D2D1::HwndRenderTargetProperties(m_hwnd, size), &m_pRenderTarget ); if (SUCCEEDED(hr)) { // Create a gray brush. hr = m_pRenderTarget->CreateSolidColorBrush( D2D1::ColorF(D2D1::ColorF::LightSlateGray), &m_pLightSlateGrayBrush ); } if (SUCCEEDED(hr)) { // Create a blue brush. hr = m_pRenderTarget->CreateSolidColorBrush( D2D1::ColorF(D2D1::ColorF::CornflowerBlue), &m_pCornflowerBlueBrush ); } if (SUCCEEDED(hr)) { m_pRenderTarget->CreateBitmapFromWicBitmap(m_pWicBitmap,NULL,&m_pD2d1Bitmap); } } return hr;}
HRESULT DemoApp::OnRender(){ HRESULT hr = S_OK; hr = CreateDeviceResources(); if (SUCCEEDED(hr)) { m_pRenderTarget->BeginDraw(); m_pRenderTarget->SetTransform(D2D1::Matrix3x2F::Identity()); m_pRenderTarget->Clear(D2D1::ColorF(D2D1::ColorF::AntiqueWhite)); D2D1_SIZE_F rtSize = m_pRenderTarget->GetSize(); // Draw a grid background. int width = static_cast<int>(rtSize.width); int height = static_cast<int>(rtSize.height); for (int x = 0; x < width; x += 10) { m_pRenderTarget->DrawLine( D2D1::Point2F(static_cast<FLOAT>(x), 0.0f), D2D1::Point2F(static_cast<FLOAT>(x), rtSize.height), m_pLightSlateGrayBrush, 0.5f ); } for (int y = 0; y < height; y += 10) { m_pRenderTarget->DrawLine( D2D1::Point2F(0.0f, static_cast<FLOAT>(y)), D2D1::Point2F(rtSize.width, static_cast<FLOAT>(y)), m_pLightSlateGrayBrush, 0.5f ); } // Draw two rectangles. D2D1_RECT_F rectangle1 = D2D1::RectF( rtSize.width/2 - 50.0f, rtSize.height/2 - 50.0f, rtSize.width/2 + 50.0f, rtSize.height/2 + 50.0f ); D2D1_RECT_F rectangle2 = D2D1::RectF( rtSize.width/2 - 100.0f, rtSize.height/2 - 100.0f, rtSize.width/2 + 100.0f, rtSize.height/2 + 100.0f ); // Draw a filled rectangle. m_pRenderTarget->FillRectangle(&rectangle1, m_pLightSlateGrayBrush); // Draw the outline of a rectangle. m_pRenderTarget->DrawRectangle(&rectangle1, m_pCornflowerBlueBrush); if(m_pD2d1Bitmap != nullptr) { D2D1_SIZE_U sizeU = m_pD2d1Bitmap->GetPixelSize(); D2D1_RECT_F rectangle3 = D2D1::RectF( (rtSize.width - sizeU.width)*0.5f, (rtSize.height - sizeU.height)*0.5f, sizeU.width + (rtSize.width - sizeU.width)*0.5f , sizeU.height + (rtSize.height - sizeU.height)*0.5f ); m_pRenderTarget->DrawBitmap(m_pD2d1Bitmap,&rectangle3,1.0f); } hr = m_pRenderTarget->EndDraw(); } if (hr == D2DERR_RECREATE_TARGET) { hr = S_OK; DiscardDeviceResources(); } return hr;}void DemoApp::DiscardDeviceResources(){ SafeRelease(&m_pRenderTarget); SafeRelease(&m_pLightSlateGrayBrush); SafeRelease(&m_pCornflowerBlueBrush);}
示例:
#pragma onceusing namespace Platform;using namespace Windows::UI::Xaml::Media::Imaging;namespace ApplicationHelpers{ public ref class ImageComponent sealed { public: ImageComponent(); public: Array<byte>^ GetBitmap(String^ filePath); private: HRESULT CreateDeviceIndependentResources(); //HRESULT CreateDeviceResources(); byte* BufferFromWriteableBitmap(WriteableBitmap^ bitmap); private: ID2D1Factory1* m_pD2dFactory; ID2D1RenderTarget* m_pRenderTarget; ID2D1SolidColorBrush* m_pLightSlateGrayBrush; ID2D1SolidColorBrush* m_pCornflowerBlueBrush; ID2D1Bitmap* m_pD2d1Bitmap; IWICImagingFactory* m_pWicFactory; IWICBitmap* m_pWicBitmap; IWICBitmapDecoder* m_pWicDecoder; IWICBitmapFrameDecode* m_pWicFrameDecoder; };}
#include "pch.h"#include "ImageComponent.h"#include "Robuffer.h"using namespace ApplicationHelpers;using namespace Windows::Storage::Streams;ImageComponent::ImageComponent(){ CreateDeviceIndependentResources();}HRESULT ImageComponent::CreateDeviceIndependentResources(){ HRESULT hr = S_OK; // Create a Direct2D factory. hr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, __uuidof(ID2D1Factory1), nullptr, (void**)&m_pD2dFactory ); hr = CoCreateInstance(CLSID_WICImagingFactory,nullptr,CLSCTX_INPROC_SERVER,IID_PPV_ARGS(&m_pWicFactory)); return hr;}Array<byte>^ ImageComponent::GetBitmap(String^ filePath){ HRESULT hr=S_OK; IWICBitmapSource* pWicSource = nullptr; IWICFormatConverter* pCovert = nullptr; if(m_pWicFactory != nullptr) { m_pWicFactory->CreateDecoderFromFilename( filePath->Data(), nullptr, GENERIC_READ, WICDecodeMetadataCacheOnDemand, &m_pWicDecoder ); m_pWicDecoder->GetFrame(0,&m_pWicFrameDecoder); m_pWicFrameDecoder->QueryInterface(IID_PPV_ARGS(&pWicSource)); // Convert the image format to 32bppPBGRA // (DXGI_FORMAT_B8G8R8A8_UNORM + D2D1_ALPHA_MODE_PREMULTIPLIED). m_pWicFactory->CreateFormatConverter(&pCovert); hr = pCovert->Initialize( pWicSource, GUID_WICPixelFormat32bppPBGRA, WICBitmapDitherTypeNone, NULL, 0.f, WICBitmapPaletteTypeCustom ); m_pWicFactory->CreateBitmapFromSource(pCovert,WICBitmapCacheOnDemand,&m_pWicBitmap); UINT pixelWidth = 0,pixelHeight = 0; m_pWicBitmap->GetSize(&pixelWidth,&pixelHeight); hr = m_pWicFactory->CreateBitmap( pixelWidth, pixelHeight, GUID_WICPixelFormat32bppPBGRA, WICBitmapCacheOnDemand, &m_pWicBitmap ); //create render target hr = m_pD2dFactory->CreateWicBitmapRenderTarget( m_pWicBitmap, D2D1::RenderTargetProperties(D2D1_RENDER_TARGET_TYPE_SOFTWARE), &m_pRenderTarget ); hr = m_pRenderTarget->CreateBitmapFromWicBitmap( pCovert, D2D1::BitmapProperties(D2D1::PixelFormat(DXGI_FORMAT_B8G8R8A8_UNORM,D2D1_ALPHA_MODE_PREMULTIPLIED)), &m_pD2d1Bitmap ); m_pRenderTarget->BeginDraw(); m_pRenderTarget->Clear(D2D1::ColorF(D2D1::ColorF::Black,0.f)); m_pRenderTarget->DrawBitmap(m_pD2d1Bitmap,D2D1::RectF(0,0,(float)pixelWidth,(float)pixelHeight)); m_pRenderTarget->EndDraw(); WICRect rcLock = { 0, 0, pixelWidth, pixelHeight }; IWICBitmapLock* pLock = nullptr; m_pWicBitmap->Lock(&rcLock,WICBitmapLockRead,&pLock); UINT pcbBufferSize = 0; byte* ppbData = nullptr; pLock->GetDataPointer(&pcbBufferSize,&ppbData); /*auto bitmap=ref new WriteableBitmap(pixelWidth, pixelHeight); byte* bytes = BufferFromWriteableBitmap(bitmap); memcpy(bytes, ppbData, pcbBufferSize); bitmap->Invalidate(); return bitmap;*/ auto bytes=ref new Array<byte>(pcbBufferSize); memcpy(bytes->Data,ppbData, pcbBufferSize); SafeRelease(&pWicSource); SafeRelease(&pCovert); SafeRelease(&pLock); return bytes; } return nullptr;}byte* ImageComponent::BufferFromWriteableBitmap(WriteableBitmap^ bitmap){ IUnknown* pUnknown = reinterpret_cast<IUnknown*>(bitmap->PixelBuffer); IBufferByteAccess* pBufferByteAccess = nullptr; HRESULT hr = pUnknown->QueryInterface(IID_PPV_ARGS(&pBufferByteAccess)); pUnknown->Release(); byte *pPixels = nullptr; hr = pBufferByteAccess->Buffer(&pPixels); return pPixels;}
/* * //var file = await StorageFile.GetFileFromApplicationUriAsync(new Uri(@"ms-appx:///Assets/1.jpg")); var file = await Package.Current.InstalledLocation.GetFileAsync(@"Assets\1.jpg"); if (file != null) { var properties = await file.Properties.GetImagePropertiesAsync(); var bitmap = new WriteableBitmap((int)properties.Width, (int)properties.Height); using (var randomAccessStream = await file.OpenReadAsync()) { bitmap.SetSource(randomAccessStream); image.Source = bitmap; image.Width = bitmap.PixelWidth; image.Height = bitmap.PixelHeight; bitmap.Invalidate(); } } * */ var bytes = _imageComponent.GetBitmap(@"Assets/1.jpg"); if (bytes != null) { var bitmap = CommonHelper.ConvertByteToWriteableBitmap(bytes, 1366, 768); image.Source = bitmap; image.Width = bitmap.PixelWidth; image.Height = bitmap.PixelHeight; bitmap.Invalidate(); }
环境:Windows8 Pro +Visual Studio 2012 Ultimate
http://www.cnblogs.com/youhui/articles/3086276.html
- Direct2d , WICBITMAP
- Direct2D 1.1
- Direct2D入门
- Direct2D 几何图形
- Direct2D 变换
- Direct2D入门
- Introducing Direct2D
- Direct2D QuickStart
- Direct2d effects
- Direct2D 简介
- Direct2D介绍
- 关于Direct2D
- [Direct2D]图片处理
- Direct2D编程入门
- Direct2D中的坐标变换
- Direct2D + 曲面细分(渐进)
- Direct2D 快速入门
- Direct2D教程(一)
- 用WASD来控制物体的前后左右移动
- android SharedPreferences 详解与开发实例
- 分配职责和职责驱动设计
- python2.7.5安装---zlib死活装不上的解决办法
- google protocol buffer (C++,Java序列化使用实例)
- Direct2d , WICBITMAP
- Direct2d effects
- CSS3伪元素Before和After应用介绍
- ubuntu 下载软件仓库信息失败,请检查网络链接
- 杭电2072
- Direct2D中的IWICBitmap接口
- WinRT使用direct2d自由旋转图片
- ScrollView和ListView套用冲突的解决方法
- spring 定时任务配置