WinRT使用direct2d自由旋转图片
来源:互联网 发布:翁虹 三级 知乎 编辑:程序博客网 时间:2024/05/18 21:08
WinRT 使用direct2d自由旋转图片
速度比GDI+绘制快上N倍。directx绘制真给力!!
WriteableBitmap^ CImagePosterPuzzle::RotateImage(WriteableBitmap^ bitmap,int rotate){ if(bitmap==nullptr) return nullptr; ID2D1RenderTarget* pRenderTarget = nullptr; IWICBitmap* pMainBimtap = nullptr; ID2D1Bitmap* pD2dBitmap = nullptr; //将WriteableBitmap转为byte[] int pixelWidth = bitmap->PixelWidth ; int pixelHeight = bitmap->PixelHeight; auto pData = ref new Array<byte>(pixelWidth*pixelHeight*4); auto dataReader = DataReader::FromBuffer(bitmap->PixelBuffer); dataReader->ReadBytes(pData); HRESULT hr=S_OK; rotate%=360; double radian=rotate*M_PI/180.f; float cosa=cos(radian); float sina=sin(radian); float newWidth= Max(abs(pixelWidth*cosa-pixelHeight*sina),abs(pixelWidth*cosa+pixelHeight*sina)); float newHeight= Max(abs(pixelWidth*sina-pixelHeight*cosa),abs(pixelWidth*sina+pixelHeight*cosa)); hr = m_pWicFractory->CreateBitmap( newWidth, newHeight, GUID_WICPixelFormat32bppPBGRA, WICBitmapCacheOnDemand, &pMainBimtap ); if(SUCCEEDED(hr)) { hr= m_pD2d1Factory->CreateWicBitmapRenderTarget( pMainBimtap, D2D1::RenderTargetProperties(), &pRenderTarget ); } //创建d2d位图 if (SUCCEEDED(hr)) { hr =pRenderTarget->CreateBitmap( D2D1::SizeU(pixelWidth,pixelHeight), pData->Data, pixelWidth*4, D2D1::BitmapProperties(D2D1::PixelFormat(DXGI_FORMAT_B8G8R8A8_UNORM,D2D1_ALPHA_MODE_PREMULTIPLIED)), &pD2dBitmap ); } if(SUCCEEDED(hr)) { pRenderTarget->BeginDraw(); pRenderTarget->Clear(D2D1::ColorF(D2D1::ColorF::White,1.f)); //计算偏移量 D2D1_POINT_2F offset = D2D1::Point2F((newWidth-pixelWidth)/2.f ,(newHeight-pixelHeight)/2.f); //中心点 D2D1_POINT_2F center= D2D1::Point2F(offset.x+pixelWidth/2,offset.y+pixelHeight/2); D2D1::Matrix3x2F angle = D2D1::Matrix3x2F::Rotation(rotate,center); pRenderTarget->SetTransform(angle); pRenderTarget->DrawBitmap(pD2dBitmap,D2D1::RectF(offset.x,offset.y,pixelWidth+offset.x,pixelHeight+offset.y)); pRenderTarget->EndDraw(); WICRect rcLock = { 0, 0, newWidth, newHeight }; IWICBitmapLock* pLock = nullptr; pMainBimtap->Lock(&rcLock,WICBitmapLockRead,&pLock); UINT pcbBufferSize = 0; byte* ppbData = nullptr; pLock->GetDataPointer(&pcbBufferSize,&ppbData); auto bmp=ref new WriteableBitmap(newWidth, newHeight); byte *pPixels = BufferFromWriteableBitmap(bmp); memcpy(pPixels, ppbData, pcbBufferSize); bmp->Invalidate(); DX::SafeRelease(&pLock); DX::SafeRelease(&pRenderTarget); DX::SafeRelease(&pMainBimtap); DX::SafeRelease(&pD2dBitmap); return bmp; } return nullptr;}byte* CImagePosterPuzzle::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;}
- WinRT使用direct2d自由旋转图片
- 使用WinRT编辑图片文件的基本和高级属性
- [Direct2D]图片处理
- Direct2D图片处理
- Direct2D WIC绘制图片
- 实现图片自旋转的同时自由移动~~
- Direct2D的使用(1)
- Direct2D的使用
- Direct2d绘制图片的问题
- Direct2d绘制图片的问题
- winRT 图片验证码生成
- 使用鼠标自由旋转三维图形的算法和思路
- OpenGL 自由旋转
- WinRT
- JQueryRotate 图片旋转插件使用
- Direct2D在VC中的使用
- Direct2D 中ID2D1Bitmap 的使用
- Direct2D 中ID2D1StrokeStyle 的使用
- Direct2d effects
- CSS3伪元素Before和After应用介绍
- ubuntu 下载软件仓库信息失败,请检查网络链接
- 杭电2072
- Direct2D中的IWICBitmap接口
- WinRT使用direct2d自由旋转图片
- ScrollView和ListView套用冲突的解决方法
- spring 定时任务配置
- 第1章 Winsock简介
- 2012年中国软件培训机构排行榜
- iPhone developer's Cookbook -- Chapter 1 Introduction
- Direct2D draw bitmap
- 基因检测
- ActivePerl安装perl脚本转exe工具pp的方法