首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用windows CopyMemory函数复制TBitmap内存

如何使用windows CopyMemory函数复制TBitmap内存
EN

Stack Overflow用户
提问于 2011-12-03 07:48:28
回答 3查看 1.7K关注 0票数 1

我有一个位图对象witdh : 1024px,高度:768px

我想把这个位图对象分成像left和right这样的两部分,但我不想在canvas中使用DrawBitmap方法,因为这个方法比CopyMemory占用更多的CPU。

我不想使用这个方法( leftImg.Canvas.DrawBitmap(MainBmp,RectF(0,0,MainBmp.Width div 2,bmp.Height),RectF(0,0,leftImg.Width,leftImg.Height),1,True);)

代码语言:javascript
复制
MainBmp := TBitmap.Create(1024, 768);

leftImg := TBitmap.Create(MainBmp.Width div 2, MainBmp.Height);
rightImg := TBitmap.Create(MainBmp.Width div 2, MainBmp.Height);

leftBits := PAlphaColorArray(leftImg.Scanline[0]);

CopyMemory(@leftBits[0], @MainBmp.StartLine[0], (MainBmp.Width div 2) * bmp.Height);

如果我这样做,他可以复制位图的一部分,但不能离开:(他从上到下复制一半。

那幅画正是我想画的。

在cut过程之后,我需要这样,而不使用任何循环(如while或for)

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-12-03 07:56:56

不行!正如您已经发现的,图像数据是逐行排列在内存中的(因此是scanline)。你想要的只有在一列接一列的情况下才有可能实现。如果没有任何循环,这是不可能的。

票数 4
EN

Stack Overflow用户

发布于 2011-12-03 08:51:37

正如您所注意到的,扫描线是从左到右的一排像素。图像中垂直高度的每个像素都有一条扫描线。

您的1024px x 768px图像有768条扫描线。从扫描线复制数据的前半部分将生成图像的上半部分。

你不必遍历每一个像素,你可以跳过,因为所有的东西都是索引的。

然而,既然你想要这两部分,你不会浪费任何的工作来经历整个事情。在遍历数据时,同时复制左侧和右侧部分。因此,对于第一条扫描线,将前半个像素复制到左侧图像,将其余像素复制到右侧图像,转到下一行,然后重复。

这应该比DrawBitmap少两倍的工作量。

此外,不是加载图像,显示它,然后拆分它,而是在加载图像时拆分它。

你仍然需要一个循环,除非你想写768次。

从技术上讲,您可以旋转图像并以您想要的方式进行旋转,但是旋转它也需要循环,并且您必须在完成后将其旋转回来。

票数 2
EN

Stack Overflow用户

发布于 2011-12-03 10:16:41

使用TCanvas.CopyRect()方法将一个TCanvas的一部分复制到另一个TCanvas。它允许两个位图具有不同的像素格式。操作系统将在内部为您处理这些差异:

代码语言:javascript
复制
MainBmp := TBitmap.Create(1024, 768); 

leftImg := TBitmap.Create(MainBmp.Width div 2, MainBmp.Height); 
rightImg := TBitmap.Create(MainBmp.Width div 2, MainBmp.Height); 

leftImg.Canvas.CopyRect(
  Rect(0, 0, leftImg.Width, leftImg.Height),
  MainBmp.Canvas,
  Rect(0, 0, leftImg.Width, leftImg.Height)
);

rightImg.Canvas.CopyRect(
  Rect(0, 0, rightImg.Width, rightImg.Height),
  MainBmp.Canvas,
  Rect(leftBmp.Width, 0, rightImg.Width, rightImg.Height)
);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8364127

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档