D2D加载图片资源(2)

※先给大家认识下什么是WIC

WIC全称是Windows Image Component,是一套扩展的API,用来处理数字图像,它是基于COM组件的。该API包含非常丰富的图像处理函数。

详细可以点击百度文库再看看  http://baike.baidu.com/view/414115.htm?fr=aladdin

看过D2D的使用(1)http://blog.csdn.net/bojie5744/article/details/29825093,我想也会熟悉了一点绘图的步骤了吧?

下面就怎么实现加载图片资源来说一下(5个步骤,实现代码比较长)。为了方便,讲解代码和上一次发的“D2D的使用(1)”结合。

1.(注意:代码接着上一次的)

在原来画矩形的基础上添加一些变量,还有头文件和链接

#include <wincodec.h>
#pragma  comment(lib,"Windowscodecs.lib")//创建WIC com需要

ID2D1Bitmap* m_pD2d1Bitmap = NULL;
IWICBitmap*    m_pWicBitmap = NULL;
IWICImagingFactory* m_pWicImagingFactory = NULL;
IWICBitmapDecoder* m_pWicDecoder = NULL;
IWICBitmapFrameDecode* m_pWicFrameDecoder = NULL;

 

2.在创建D2D渲染器后,创建WIC com接口(其实2者没有什么先后创建的顺序,就是方便讲解)

 CoCreateInstance(CLSID_WICImagingFactory,nullptr,CLSCTX_INPROC_SERVER,IID_PPV_ARGS(&m_pWicImagingFactory));

 

3.用WIC加载图片,然后把WIC转换为D2D兼容的图片显示。

if(m_pWicImagingFactory != NULL)
 {
  m_pWicImagingFactory->CreateDecoderFromFilename(L"C:/a.bmp",nullptr,GENERIC_READ,WICDecodeMetadataCacheOnDemand,&m_pWicDecoder);

//"C:/a.bmp"为你的图片资源地址
  m_pWicDecoder->GetFrame(0,&m_pWicFrameDecoder);
  IWICBitmapSource* pWicSource = NULL;
  m_pWicFrameDecoder->QueryInterface(IID_PPV_ARGS(&pWicSource));
  IWICFormatConverter* pCovert = NULL;
  m_pWicImagingFactory->CreateFormatConverter(&pCovert);
   pCovert->Initialize(
   pWicSource,
   GUID_WICPixelFormat32bppPBGRA,
   WICBitmapDitherTypeNone,
   NULL,
   0.f,
   WICBitmapPaletteTypeCustom
   );

  m_pWicImagingFactory->CreateBitmapFromSource(pCovert,WICBitmapCacheOnDemand,&m_pWicBitmap);
  UINT pixelWidth = 0,pixelHeight = 0;
  m_pWicBitmap->GetSize(&pixelWidth,&pixelHeight);
  SAFE_RELEASE(pCovert);

 }
    pRenderTarget->CreateBitmapFromWicBitmap(m_pWicBitmap,NULL,&m_pD2d1Bitmap);

 

4.在绘图区域中添加代码实现图片的绘制

绘图区域是:

pRenderTarget->BeginDraw() ;

//绘图区域

hr = pRenderTarget->EndDraw() ;

里面的代码以下:

D2D1_SIZE_F rtSize = pRenderTarget->GetSize();
 if(m_pD2d1Bitmap != NULL)
 {
  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
   );

  pRenderTarget->DrawBitmap(m_pD2d1Bitmap,&rectangle3,1.0f);
 }

就这样就好了。最后就是释放指针。

 

 

以下就是完整的代码和演示效果:

ID2D1Factory* pD2DFactory = NULL;
ID2D1HwndRenderTarget* pRenderTarget=NULL;//用来在窗口中进行渲染 
ID2D1SolidColorBrush* pBlackBrush=NULL;//定义画刷,用来绘制图形
ID2D1RadialGradientBrush* pRadialGradientBrush=NULL; 
#define SAFE_RELEASE(p) if(p){p->Release() ; p = NULL ;} 

ID2D1Bitmap* m_pD2d1Bitmap;
IWICBitmap*    m_pWicBitmap;
IWICImagingFactory* m_pWicImagingFactory;
IWICBitmapDecoder* m_pWicDecoder;
IWICBitmapFrameDecode* m_pWicFrameDecoder;

VOID MyDraw(HWND hwnd)
{
 HRESULT hr;
 RECT rc={0,0,500,500};//渲染矩形大小
 hr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &pD2DFactory) ;
 if(!SUCCEEDED(hr))
 {
  MessageBox(hwnd,"创建D2D设备出错","Error",0);
 }
 hr = pD2DFactory->CreateHwndRenderTarget(
  D2D1::RenderTargetProperties(),
  D2D1::HwndRenderTargetProperties(
  hwnd,
  D2D1::SizeU(rc.right - rc.left,rc.bottom - rc.top)),
  &pRenderTarget) ;

 if(!SUCCEEDED(hr))
 {
  MessageBox(hwnd,"创建渲染器失败","Error",0);
 }

 hr = CoCreateInstance(CLSID_WICImagingFactory,nullptr,CLSCTX_INPROC_SERVER,IID_PPV_ARGS(&m_pWicImagingFactory));
 if(m_pWicImagingFactory != nullptr)
 {
  m_pWicImagingFactory->CreateDecoderFromFilename(L"C:/a.bmp",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;
  m_pWicImagingFactory->CreateFormatConverter(&pCovert);
  hr = pCovert->Initialize(
   pWicSource,
   GUID_WICPixelFormat32bppPBGRA,
   WICBitmapDitherTypeNone,
   NULL,
   0.f,
   WICBitmapPaletteTypeCustom
   );

  m_pWicImagingFactory->CreateBitmapFromSource(pCovert,WICBitmapCacheOnDemand,&m_pWicBitmap);
  SAFE_RELEASE(pCovert);
  UINT pixelWidth = 0,pixelHeight = 0;
  m_pWicBitmap->GetSize(&pixelWidth,&pixelHeight);
 }
    pRenderTarget->CreateBitmapFromWicBitmap(m_pWicBitmap,NULL,&m_pD2d1Bitmap);

 hr = pRenderTarget->CreateSolidColorBrush(D2D1::ColorF(D2D1::ColorF::Red),&pBlackBrush);
 if(!SUCCEEDED(hr))
 {
  MessageBox(hwnd,"创建失败","Error",0);
 }


 pRenderTarget->BeginDraw() ;
 pRenderTarget->Clear(D2D1::ColorF(D2D1::ColorF::White,0));

 /*****************绘制图片*************************/
 D2D1_SIZE_F rtSize = pRenderTarget->GetSize();
 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
   );

  pRenderTarget->DrawBitmap(m_pD2d1Bitmap,&rectangle3,1.0f);
 }
 /*****************绘制图片*************************/

 /*****************绘制矩形*************************/
 pRenderTarget->DrawRectangle(
  D2D1::RectF(
  rc.left + 100.0f,
  rc.top + 100.0f,
  rc.right - 100.0f,
  rc.bottom - 100.0f),
  pBlackBrush);
 /*****************绘制矩形*************************/

 pRenderTarget->EndDraw() ;
 SAFE_RELEASE(m_pWicBitmap);//这个图片资源记得释放,不然会不断增加内存,不然,你可以把它创建完后,就不要再创建,到程序结束后再释放。

 SAFE_RELEASE(pBlackBrush) ;
 SAFE_RELEASE(pRadialGradientBrush);
}

由于编写比较急,有很多判断没有写,还有可以有些地方需要释放指针的没有释放(有空会改回来)。读者可以自行修改下,代码的实现

是没有问题的。

直接在OnPaint()函数中添加MyDraw(m_hWnd);就好了。

Center

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: D2D通信资源分配(Device-to-Device communication resource allocation)是一种用于移动通信网络中的D2D通信的资源调度算法。D2D通信是指终端之间在无线网络中直接进行通信,而无需经过基站的中继。这种方式可以提高用户体验、降低网络负载以及延长终端电池寿命。 D2D通信资源分配代码的实现包括以下几个关键步骤: 1. 网络拓扑建立:首先需要建立移动网络的拓扑结构,确定终端之间的连接关系。 2. 信道分配:基于网络拓扑结构和终端的通信需求,进行信道分配。这涉及到频率、时间和功率的分配,以确保终端之间的通信不会互相干扰。 3. 功率控制: 当多个终端同时使用相同的频率进行D2D通信时,需要进行功率控制,以避免互相之间的干扰。功率控制算法可以根据终端之间的距离、信号质量等因素来确定适当的发送功率。 4. 资源分配优化:在信道和功率分配的基础上,可以进行资源分配的优化。此时可以考虑终端之间的通信需求、通信链路质量以及网络拥塞等因素,通过数学模型和优化算法来最大化资源利用率和系统性能。 5. 协议设计:D2D通信资源分配需要设计相应的协议来管理终端之间的通信。协议可以包括资源请求、资源分配、确认和反馈等步骤,以确保通信的可靠性和效率。 以上是D2D通信资源分配代码的主要实现要点。实际的代码实现可能基于特定的通信网络平台和算法要求进行调整,但核心思路包括建立网络拓扑、信道分配、功率控制、资源分配优化和协议设计。这些步骤的协同工作可以实现高效可靠的D2D通信资源分配。 ### 回答2: D2D(Device-to-Device)通信是一种直接设备间的通信模式,允许设备在不经过网络基站的情况下直接进行通信。在D2D通信中,通信资源的分配是非常重要的,主要用于协调D2D通信设备之间的频谱、功率和时间分配。 对于D2D通信资源分配的代码实现,首先需要考虑到设备之间的频谱资源的分配。可以采用频谱感知的方式,通过扫描周围的频谱环境来选择一个可用的频段。可以利用Python或Matlab编写代码实现频谱扫描和选择可用频段的功能。 其次,还需要考虑到功率资源的分配。可以通过动态功率控制来进行分配,根据设备之间的距离和信道质量进行功率的调整。利用相关的信道模型和算法,可以编写代码实现动态功率控制的功能。 最后,时间资源的分配也是重要的一部分。可以使用时隙分配的方法,将时间划分为不同的时隙,每个D2D设备在一个时隙内进行通信。可以编写代码实现时隙分配的算法,根据不同设备的需求和网络负载情况,来分配不同的时隙。 综上所述,D2D通信资源分配的代码需要包括频谱、功率、时间三方面的分配功能。通过合理的算法和模型,实现资源的优化分配,可以提高D2D通信的效率和性能。这样的代码在实际的D2D通信应用中具有重要的作用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喜欢吃一口烤肉的啵啵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值