StretchDIBits速度测试(HALFTONE)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010839382/article/details/52266495

StretchDIBits速度测试(HALFTONE)

下面实验中显示窗口大小为1024*768,拉伸模式设为HALFTONE.

一、单通道图像

(1) 保持图像高度为1024,宽度从24到2024递增,递增间隔为50,下表为统计的显示耗时与图像宽度的关系:

图像大小

耗时(ms)

  24*1024

9.796325

  74*1024

10.30184

 124*1024

11.06231

 174*1024

11.52316

 224*1024

12.18715

 274*1024

12.82155

 324*1024

13.90718

 374*1024

14.06984

 424*1024

15.17017

 474*1024

16.04815

 524*1024

15.77539

 574*1024

16.67529

 624*1024

17.4869

 674*1024

18.27007

 724*1024

19.01788

 774*1024

19.91023

 824*1024

20.69174

 874*1024

21.47563

 924*1024

22.23963

 974*1024

23.02346

1024*1024

13.38007

1074*1024

17.87468

1124*1024

17.87868

1174*1024

18.00601

1224*1024

18.34404

1274*1024

18.46858

1324*1024

18.66459

1374*1024

18.92393

1424*1024

19.42043

1474*1024

19.15088

1524*1024

19.39751

1574*1024

19.64754

1624*1024

19.66112

1674*1024

19.89338

1724*1024

20.06777

1774*1024

21.01717

1824*1024

20.7319

1874*1024

20.71387

1924*1024

20.94786

1974*1024

21.01869

2024*1024

21.262

将其绘成曲线图如下:


可以看出显示耗时与图像宽度近似成分段线性关系,分界点为图像宽度与显示窗口宽度相等处(1024)。

设y=kx+b(x为图像宽度,y为显示耗时),利用matlab拟合函数polyfit可分别获得分界点两侧的拟合参数:

k1=0.0139   b1=9.1524

 k2=0.0038    b2=13.7103

另外分界点处耗时有一个陡降。

(2) 保持图像宽度为1024,高度从24到2024递增,递增间隔为50,下表为统计的显示耗时与图像高度的关系:

图像大小

耗时(ms)

1024*  24

7.922394

1024*  74

8.323548

1024* 124

8.604275

1024* 174

8.839572

1024* 224

9.096586

1024* 274

9.196709

1024* 324

9.748702

1024* 374

10.32994

1024* 424

9.921846

1024* 474

10.37223

1024* 524

10.82544

1024* 574

11.26785

1024* 624

11.65634

1024* 674

12.15726

1024* 724

12.6009

1024* 774

12.46721

1024* 824

12.63217

1024* 874

12.80108

1024* 924

12.96082

1024* 974

13.11883

1024*1024

13.37327

1024*1074

13.40269

1024*1124

13.56866

1024*1174

13.73107

1024*1224

13.88093

1024*1274

14.00228

1024*1324

14.16945

1024*1374

14.32908

1024*1424

14.59283

1024*1474

14.70967

1024*1524

14.77312

1024*1574

14.92603

1024*1624

15.088

1024*1674

15.25403

1024*1724

15.39717

1024*1774

15.57855

1024*1824

15.70022

1024*1874

15.86984

1024*1924

16.02325

1024*1974

16.19249

1024*2024

16.39066

将其绘成曲线图如下:


可以看出显示耗时与图像高度近似成分段线性关系,分界点为图像高度与显示窗口高度相等处(768)。

设y=kx+b(x为图像高度,y为显示耗时),利用matlab拟合函数polyfit可分别获得分界点两侧的拟合参数:

k1=0.0063   b1=7.6820

k2=0.0031    b2=10.0960

二、三通道图像

(1) 保持图像高度为1024,宽度从24到2024递增,递增间隔为50,下表为统计的显示耗时与图像宽度的关系:

图像大小

耗时(ms)

  24*1024

9.712231

  74*1024

10.25534

 124*1024

10.96412

 174*1024

11.37105

 224*1024

12.03373

 274*1024

12.59427

 324*1024

13.67067

 374*1024

13.79808

 424*1024

14.90897

 474*1024

15.75245

 524*1024

15.31296

 574*1024

16.38553

 624*1024

16.99361

 674*1024

17.69326

 724*1024

18.42575

 774*1024

19.25657

 824*1024

20.01591

 874*1024

20.79176

 924*1024

21.66283

 974*1024

22.35087

1024*1024

12.59428

1074*1024

17.07724

1124*1024

17.02248

1174*1024

17.11959

1224*1024

17.45603

1274*1024

17.54791

1324*1024

17.68652

1374*1024

17.86168

1424*1024

18.22364

1474*1024

18.08724

1524*1024

18.31654

1574*1024

18.49236

1624*1024

18.47719

1674*1024

18.68564

1724*1024

18.82272

1774*1024

19.72777

1824*1024

19.5421

1874*1024

19.43485

1924*1024

19.55297

1974*1024

19.59999

2024*1024

19.82148

将其绘成曲线图如下:


可以看出显示耗时与图像宽度近似成分段线性关系,分界点为图像宽度与显示窗口宽度相等处(1024)。

设y=kx+b(x为图像宽度,y为显示耗时),利用matlab拟合函数polyfit可分别获得分界点两侧的拟合参数分别为:

k1=0.0131   b1=9.1398

k2=0.0031   b2=13.5624

另外,在分界点处有一个陡降。

(2) 保持图像宽度为1024,高度从24到2024递增,递增间隔为50,下表为统计的显示耗时与图像高度的关系:

图像大小

耗时(ms)

1024*  24

8.026322

1024*  74

8.360508

1024* 124

8.694708

1024* 174

8.887985

1024* 224

8.96708

1024* 274

9.122874

1024* 324

9.685652

1024* 374

10.24135

1024* 424

9.698556

1024* 474

10.12444

1024* 524

10.56098

1024* 574

10.99098

1024* 624

11.34635

1024* 674

11.81408

1024* 724

12.22322

1024* 774

12.04397

1024* 824

12.17597

1024* 874

12.31361

1024* 924

12.44259

1024* 974

12.52316

1024*1024

12.67153

1024*1074

12.79061

1024*1124

12.96766

1024*1174

13.0645

1024*1224

13.19001

1024*1274

13.34681

1024*1324

13.41933

1024*1374

13.54006

1024*1424

13.67576

1024*1474

13.76805

1024*1524

13.86556

1024*1574

13.98719

1024*1624

14.20426

1024*1674

14.33093

1024*1724

14.34395

1024*1774

14.45257

1024*1824

14.52384

1024*1874

14.65117

1024*1924

14.75053

1024*1974

14.90093

1024*2024

15.00206

将其绘成曲线图如下:


可以看出显示耗时与图像高度近似成分段线性关系,分界点为图像高度与显示窗口高度相等处(768)。

设y=kx+b(x为图像高度,y为显示耗时),利用matlab拟合函数polyfit可分别获得分界点两侧的拟合参数分别为:

k1=0.0056   b1=7.8175

 k2=0.0024    b2=10.2718

三、四通道图像

(1) 保持图像高度为1024,宽度从24到2024递增,递增间隔为50,下表为统计的显示耗时与图像宽度的关系:

图像大小

耗时(ms)

  24*1024

9.70437

  74*1024

10.29571

 124*1024

11.08899

 174*1024

11.57984

 224*1024

12.27431

 274*1024

12.95063

 324*1024

14.02857

 374*1024

14.23232

 424*1024

15.31075

 474*1024

16.18275

 524*1024

15.8119

 574*1024

16.73363

 624*1024

17.65325

 674*1024

18.48042

 724*1024

19.21561

 774*1024

20.10856

 824*1024

21.03733

 874*1024

21.66679

 924*1024

22.49946

 974*1024

23.2506

1024*1024

13.60484

1074*1024

18.15904

1124*1024

18.12392

1174*1024

18.29726

1224*1024

18.6863

1274*1024

18.77742

1324*1024

18.98858

1374*1024

19.23924

1424*1024

19.64915

1474*1024

19.55219

1524*1024

19.78194

1574*1024

20.00765

1624*1024

20.1667

1674*1024

20.42337

1724*1024

20.49683

1774*1024

21.43063

1824*1024

21.11269

1874*1024

21.16554

1924*1024

21.39043

1974*1024

21.48354

2024*1024

21.76705

将其绘成曲线图如下:


可以看出显示耗时与图像宽度近似成分段线性关系,分界点为图像宽度与显示窗口宽度相等处(1024)。

设y=kx+b(x为图像宽度,y为显示耗时),利用matlab拟合函数polyfit可分别获得分界点两侧的拟合参数分别为:

K1=0.0142   b1=9.1429

K2=0.0040   b2=13.7226

另外,分界点处有一个陡降。

(2) 保持图像宽度为1024,高度从24到2024递增,递增间隔为50,下表为统计的显示耗时与图像高度的关系:

图像大小

耗时(ms)

1024*  24

7.991773

1024*  74

8.330941

1024* 124

8.728022

1024* 174

8.949873

1024* 224

9.212036

1024* 274

9.314224

1024* 324

9.915585

1024* 374

10.48732

1024* 424

10.06826

1024* 474

10.53688

1024* 524

11.00385

1024* 574

11.51198

1024* 624

11.86265

1024* 674

12.37443

1024* 724

12.82756

1024* 774

12.96574

1024* 824

13.07387

1024* 874

13.06449

1024* 924

13.29595

1024* 974

13.50984

1024*1024

13.61576

1024*1074

13.72418

1024*1124

13.89101

1024*1174

14.05147

1024*1224

14.19271

1024*1274

14.35607

1024*1324

14.49231

1024*1374

14.67447

1024*1424

14.8504

1024*1474

15.04389

1024*1524

15.17076

1024*1574

15.34374

1024*1624

15.50715

1024*1674

15.70393

1024*1724

15.8263

1024*1774

16.02004

1024*1824

16.15512

1024*1874

16.3089

1024*1924

16.47101

1024*1974

16.65223

1024*2024

16.85534

 

将其绘成曲线图如下:

 

可以看出显示耗时与图像高度近似成分段线性关系,分界点为图像高度与显示窗口高度相等处(768)。

设y=kx+b(x为图像高度,y为显示耗时),利用matlab拟合函数polyfit可分别获得分界点两侧的拟合参数分别为:

k1=0.0066   b1=7.7498

 k2=0.0032    b2=10.3651

总结:

利用StretchDIBits进行位图数据显示,缩放模式HALFTONE,不管图像是几通道,特征基本一致:

(1) 显示耗时与图像宽度成分段线性关系,分界点为图像宽度与显示窗口宽度相等处,且图像宽度小于窗口宽度时的一次项系数要大于图像宽度大于窗口宽度时的一次项系数。分界点处耗时有一个陡降。

(2) 显示耗时与图像高度成分段线性关系。分界点为图像高度与显示窗口高度相等处,且图像宽度小于窗口高度时的一次项系数要大于图像宽度大于窗口高度时的一次项系数

下面是一个测试程序,源码下载


展开阅读全文

WINDOWS GDI SetStretchBltMode(HALFTONE),StretchDIBits占用CPU过高的问题

12-30

void CVideoOutputDevice::Redraw(HDC curDC,CWnd *pWndDraw)rnrn _ASSERT( curDC);rnrn if(pWndDraw == NULL ||curDC == NULL)rn return;rn if ( !IsWindow(pWndDraw->GetSafeHwnd()))rn return;rn ::SetStretchBltMode(curDC, HALFTONE);rn CPoint pointZero(0,0);rn SetBrushOrgEx(curDC,0,0,NULL);rn CRect rect;rnrn pWndDraw->GetWindowRect(&rect);rn pWndDraw->ScreenToClient(&rect);rn // Important note: rn // Images height is measured from the bottom in the framestorern int result=0;rn //m_hWnd->GetClientRect( &m_rect); //在挂机,会报错。 没有先停止redrnrn if (frameWidth == (unsigned)rect.right && frameHeight == (unsigned)rect.bottom)rn rnrn result = SetDIBitsToDevice(curDC,rn 0, 0, frameWidth, frameHeight,rn 0, 0, 0, frameHeight,rn frameStore.GetPointer(), &m_bitmap, DIB_RGB_COLORS);rn rn else if ( m_doLocalVideoPnP)rn rn [color=#00FFFF]////本地显示 - Height(),会向上翻rn //HDC dcMem ;rn rn //dcMem = CreateCompatibleDC(curDC);rn //rn //HBITMAP bitmapMem = CreateCompatibleBitmap(curDC,rect.Width(), rect.Height());rn //HGDIOBJ objectOld = SelectObject(dcMem,(HGDIOBJ)bitmapMem);rn //SetStretchBltMode(dcMem,HALFTONE);rn //BitBlt(dcMem,0,0,rect.Width(), rect.Height(),curDC,0,0,SRCCOPY);rn //result=StretchDIBits(dcMem,rn // 0, 0, rect.Width(), rect.Height(), //目标区左上角的X/Y座标,宽度和高度//加 - (int), 会向左映射rn // 0, 0, frameWidth, frameHeight, // 来源区左上角的X/Y座标,宽度和高度rn // frameStore.GetPointer(), &m_bitmap, DIB_RGB_COLORS, SRCCOPY);rn //BitBlt(curDC,0,0, rect.Width(), rect.Height(),dcMem,0,0,SRCCOPY);rn //rn //SelectObject(dcMem,objectOld);rn //DeleteObject(bitmapMem);rn //DeleteDC(dcMem);rn[/color]rnrn [color=#FF6600] result = StretchDIBits(curDC, rn 0, 0, rect.Width(), rect.Height(), //目标区左上角的X/Y座标,宽度和高度//加 rn 0, 0, frameWidth, frameHeight, // 来源区左上角的X/Y座标,宽度和高度rn frameStore.GetPointer(), &m_bitmap, DIB_RGB_COLORS, SRCCOPY);[/color]rnrn rn else if (!m_isLocal || (m_isLocal && !m_doLocalVideoPnP)) rn rn //远程, 或本地视频并且不允许调整大小rn //永远不会执行?rn rn result = SetDIBitsToDevice(curDC,rn 0, 0, frameWidth, frameHeight,rn 0, 0, 0, frameHeight,rn frameStore.GetPointer(), &m_bitmap, DIB_RGB_COLORS);rn rnrn if (result == GDI_ERROR) rn lastError = ::GetLastError();rn#if PTRACINGrn PTRACE(2, "VidOut\tDrawing image failed, error=" << lastError);rn#endifrn rnrn1:函数用于画一个视频帧到window dc frameStore.GetPointer()是RGB内存;代码本身是可以运行的但是在某些机器上CPU占用%80以上但是我的机器是不会出现这个问题的我的机器CPU占用35%左右,系统都是XPSP2;配置差不多环境变量一致;出现的CPU占用%80以上的机器有一半左右;rn2:假如在函数里面不使用::rn SetStretchBltMode(curDC, HALFTONE);rn CPoint pointZero(0,0);rn SetBrushOrgEx(curDC,0,0,NULL);rn那么就是所有的机器都可以运行并且CPU占用30%左右;但是视频图象效果不好有锯齿,图象并不平滑;rn初步认为是SetStretchBltMode(curDC, HALFTONE);导致刷新闪烁导致CPU占用过高;为什么我的机器不会呢??rnrnrn3:代码改为用内存DC拉伸,代码如下rnvoid CVideoOutputDevice::Redraw(HDC curDC,CWnd *pWndDraw)rnrn _ASSERT( curDC);rnrn if(pWndDraw == NULL ||curDC == NULL)rn return;rn if ( !IsWindow(pWndDraw->GetSafeHwnd()))rn return;rn ::SetStretchBltMode(curDC, HALFTONE);rn CPoint pointZero(0,0);rn SetBrushOrgEx(curDC,0,0,NULL);rn CRect rect;rnrn pWndDraw->GetWindowRect(&rect);rn pWndDraw->ScreenToClient(&rect);rn // Important note: rn // Images height is measured from the bottom in the framestorern int result=0;rn //m_hWnd->GetClientRect( &m_rect); //在挂机,会报错。 没有先停止redrnrn if (frameWidth == (unsigned)rect.right && frameHeight == (unsigned)rect.bottom)rn rnrn result = SetDIBitsToDevice(curDC,rn 0, 0, frameWidth, frameHeight,rn 0, 0, 0, frameHeight,rn frameStore.GetPointer(), &m_bitmap, DIB_RGB_COLORS);rn rn else if ( m_doLocalVideoPnP)// && !m_wndDlg->hidePnP) rn rn ////本地显示 - Height(),会向上翻rn //HDC dcMem ;rn rn [color=#00FF00]HDC dcMem = CreateCompatibleDC(curDC);rn rn HBITMAP bitmapMem = CreateCompatibleBitmap(curDC,rect.Width(), rect.Height());rn HGDIOBJ objectOld = SelectObject(dcMem,(HGDIOBJ)bitmapMem);rn SetStretchBltMode(dcMem,HALFTONE);rn BitBlt(dcMem,0,0,rect.Width(), rect.Height(),curDC,0,0,SRCCOPY);rn result=StretchDIBits(dcMem,rn 0, 0, rect.Width(), rect.Height(), //目标区左上角的X/Y座标,宽度和高度//加 - (int), 会向左映射rn 0, 0, frameWidth, frameHeight, // 来源区左上角的X/Y座标,宽度和高度rn frameStore.GetPointer(), &m_bitmap, DIB_RGB_COLORS, SRCCOPY);rn BitBlt(curDC,0,0, rect.Width(), rect.Height(),dcMem,0,0,SRCCOPY);rn rn SelectObject(dcMem,objectOld);rn DeleteObject(bitmapMem);rn DeleteDC(dcMem);rn[/color]rnrn [color=#FF6600]//result = StretchDIBits(curDC, rn // 0, 0, rect.Width(), rect.Height(), //目标区左上角的X/Y座标,宽度和高度//加 rn // 0, 0, frameWidth, frameHeight, // 来源区左上角的X/Y座标,宽度和高度rn // frameStore.GetPointer(), &m_bitmap, DIB_RGB_COLORS, SRCCOPY);[/color]rnrn rn else if (!m_isLocal || (m_isLocal && !m_doLocalVideoPnP)) rn rn //远程, 或本地视频并且不允许调整大小rn //永远不会执行?rn rn result = SetDIBitsToDevice(curDC,rn 0, 0, frameWidth, frameHeight,rn 0, 0, 0, frameHeight,rn frameStore.GetPointer(), &m_bitmap, DIB_RGB_COLORS);rn rnrn if (result == GDI_ERROR) rn lastError = ::GetLastError();rn#if PTRACINGrn PTRACE(2, "VidOut\tDrawing image failed, error=" << lastError);rn#endifrn rnrn采用内存拉伸以后我的机器也出现了CPU占用80%以上;MY GOD!!! WHY????rn请帮忙啊!!!!谢谢。rnrnrnrn 论坛

没有更多推荐了,返回首页