D2D加载图片资源(2)

article/2025/9/26 19:19:28

※先给大家认识下什么是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

 


http://chatgpt.dhexx.cn/article/kB7OORng.shtml

相关文章

5G关键技术,D2D通信-ielab

D2D&#xff08;device to device&#xff09;技术是指两个对等的用户节点之间直接进行通信的一种通信方式。在由D2D通信用户组成的分散式网路中&#xff0c;每个用户节点都能发送和接收信号&#xff0c;并具有自动路由(转发消息)的功能。网路的参与者共用它们所拥有的一部分硬…

D2D D3D12 渲染视频帧思路及实现

写在之前 耗时2个月&#xff0c;写完公司的音视频处理系统。对于整个音视频处理有了基本的了解。个人感觉最坑的地方有三&#xff1a; 编解码音视频录制的同步视频预览渲染&#xff08;视频帧的渲染&#xff09; 由于在以后要支持同时多路1080P录制及预览&#xff0c;所以对…

车载通信与导航(五):D2D通信流程

取自https://blog.csdn.net/u012159948/article/details/20059927 D2D技术可以应用于移动蜂窝网络&#xff0c;以提高资源利用率和网络容量。每一个D2D通信链路占用的资源与一个蜂窝通信链路占用的相等。D2D通信将在宏蜂窝基站的控制下获得通信所需的频率资源和传输功率。它与蜂…

关于字体绘制的baseline (QT 和 D2D)

常规字体绘制API调用: QT:QPainter::drawText D2D: ID2D1RenderTarget::DrawText 以上字体绘制某些特殊效果无法达到, 我们可以用Path绘制字体: QPainterPath::addText(qreal x, qreal y, const QFont &f, const QString &text); D2D: 将字用指定字体属性绘制好,…

DirectX12(D3D12)基础教程(十三)——D2D、DWrite On D3D12与文字输出

文章目录 1、 前言2、D2D、DWrite简介3、添加D2D、DWrite基础支持文件4、D2D、DWrite基本编程步骤5、基于D3D11On12设备创建D2D渲染目标6、创建DWrite字体用D2D显示文字7、D2D、D3D11on12与D3D12同步 1、 前言 在经过了前面一系列章节的“狂轰滥炸”式的学习之后&#xff0c;如…

D2D

D2D: Device-to-Device即是设备到设备的通信。 1.认识D2D 基于蜂窝网络的D2D通信&#xff0c;或称为邻近服务&#xff08;Proximity Service,ProSe&#xff09;&#xff0c;是指用户数据可不会经过网络中转直接在终端之间传输。D2D通信与传统的通信架构有显著区别&#xff0c…

D2D与蜂窝系统间的干扰

上行频段:D2D发射端UE3对基站的干扰,蜂窝UE1对D2D接收端UE4的干扰;下行频段:基站对D2D接收端UE4的干扰,D2D发射端UE3对蜂窝UE2的干扰。 D2D复用上行资源:eNB会受到D2D的干扰,D2D中的UE都受eNB的控制,eNB为其分配资源,同时也控制最大发射功率,而且还能够将蜂窝的功控信息…

关于D2D

前段时间发现微软的DirectX是如此的强悍&#xff0c;并且对于开发windows程序是如此的重要&#xff0c;决定到msdn去看看&#xff0c;下面是对D2D的介绍&#xff0c;后面会陆续贴上&#xff0c;这是我的第一篇译文&#xff0c;有误之处&#xff0c;还请指教。 什么是D2D? D2D…

移动通信网络规划:D2D通信技术

D2D通信技术 一、什么是D2D通信技术 D2D即Device-to-Device&#xff0c;也称之为终端直通。D2D通信技术是指两个对等的用户节点之间直接进行通信的一种通信方式。 如图中所示。在由D2D通信用户组成的分散式网络中&#xff0c;每个用户节点都能发送和接收信号&#xff0c;并具有…

D2D网络架构介绍

D2D(Device-to-Device)通信,也称为邻近服务(Proximity Service,ProSe),是由3GPP组织提出的一种点到点的无线通信技术,它可以在蜂窝通信系统的控制下允许LTE终端之间利用小区无线资源直接进行通信,而不经过蜂窝网络中转。作为面向5G的关键候选技术,D2D技术能够提升通信…

车载通信与导航(七):D2D通信详解

D2D&#xff08;设备到设备&#xff09;&#xff0c;即临近终端设备之间直接进行通信的技术&#xff0c;在通信网络中&#xff0c;一旦D2D通信链路建立起来&#xff0c;传输语音或数据消息就无需基站的干预&#xff0c;这样就可以减轻通信系统中基站及核心网络的数据压力&#…

C中strchr()函数用法

strchr()函数包含于头文件&#xff1a;#include<stdio.h>中&#xff1b; 函数原型为&#xff1a;char * strchr(char * str, char/int c); 函数功能为&#xff1a;在字符串str中寻找字符C第一次出现的位置&#xff0c;并返回其位置&#xff08;地址指针&#xff09;&am…

php strchr 截断,PHP strchr() 函数

w3school 教程 PHP String 函数 查找 "world" 在 "Hello world!" 中的第一次超并返回此字符串的其余个别&#xff1a; echo strchr("Hello world!","world"); ?> 运行实例 strchr() 函数搜他串在另一字符串中的第一次常 该函数是 …

php strchr 截断,php 常用字符串函数 - strchr

...转义的字符串 三、检索字符串函数/strstr()函数和strchr()函数$str "abc123.com"; $tem strchr($str,""); $tep strstr($str, ""); $ten 以下列出开发中常用的字符串函数&#xff0c;以供自己需要的时候查阅 长度 strlen($string):得到字符…

strchr的用法

strchr&#xff08;char *s,char *c&#xff09; 查找字符c第一次出现在字符串s中的位置 返回值&#xff1a;如果找到指定的字符则返回该字符所在地址&#xff1b;否则返回NULL. 例1&#xff1a; #include <cstring> #include <cstdio> int main() {char sstri…

php strchr和strrchr,strrchr与Strchr

strrchr 取得某字符最后出现处起的字符串。 语法: string strrchr(string haystack, string needle); 返回值: 整数 函数种类: 资料处理 内容说明 本函数用来寻找字符串 haystack 中的字符 needle 最后出现位置&#xff0c;并将此位置起至字符串 haystack 结束之间的字符串返回…

php strchr 截断,php字符串处理函数详解 - strchr

...substr($add,0,strlen($add)-1); }if($word>){ $flag1; } }if(strchr($add,$keytop)){ $found1; }if(strchr($add,$keybottom)){ $found0; $end1; }if(((strchr($add, PHP处理字符串的能力非常强大,方法也是多种多样,但有的时候你需要选择一种最简单且理想的解决方法,文章…

ipv6环境搭建

2018年4月30日 iOS上架必须适配ipv6的网络&#xff0c;我也因为这个原因被拒了。为适配ipv6&#xff0c;就必须创建一个ipv6环境&#xff0c;本文介绍了使用Mac搭建ipv6环境的2种方法。 根据有、无网线&#xff0c;可分为2种场景来搭建。 有线网情况下创建ipv6环境 目标 通过…

搭建一个简单的SDN网络环境

第1小题&#xff1a;简单网络 说明&#xff1a;由于对于SDN架构的理解在学界和业界并没有统一&#xff0c;为了方便参赛队员选择&#xff0c;对于初学者&#xff0c;大赛推荐OpenFlow作为南向接口来实现SDN环境&#xff0c;以下给出分别针对采用OpenFlow和采用其他接口的具体要…

Hyperledger Fabric网络环境手动配置及其链码自动化部署

目录 5.1 网络环境的搭建 5.1.1 生成组织结构与身份证书 5.1.2 生成创世区块和通道 5.1.3 启动Fabric网络 5.1.4 创建Fabric-SDK-GO对象并建立通道 5.1.5 Fabric-SDK-Go实现链码的自动部署 5.2 链码实现 5.1 网络环境的搭建 5.1.1 生成组织结构与身份证书 Hyperledger Fabric…