我有一个位图对象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);)
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)

谢谢
发布于 2011-12-03 07:56:56
不行!正如您已经发现的,图像数据是逐行排列在内存中的(因此是scanline)。你想要的只有在一列接一列的情况下才有可能实现。如果没有任何循环,这是不可能的。
发布于 2011-12-03 08:51:37
正如您所注意到的,扫描线是从左到右的一排像素。图像中垂直高度的每个像素都有一条扫描线。
您的1024px x 768px图像有768条扫描线。从扫描线复制数据的前半部分将生成图像的上半部分。
你不必遍历每一个像素,你可以跳过,因为所有的东西都是索引的。
然而,既然你想要这两部分,你不会浪费任何的工作来经历整个事情。在遍历数据时,同时复制左侧和右侧部分。因此,对于第一条扫描线,将前半个像素复制到左侧图像,将其余像素复制到右侧图像,转到下一行,然后重复。
这应该比DrawBitmap少两倍的工作量。
此外,不是加载图像,显示它,然后拆分它,而是在加载图像时拆分它。
你仍然需要一个循环,除非你想写768次。
从技术上讲,您可以旋转图像并以您想要的方式进行旋转,但是旋转它也需要循环,并且您必须在完成后将其旋转回来。
发布于 2011-12-03 10:16:41
使用TCanvas.CopyRect()方法将一个TCanvas的一部分复制到另一个TCanvas。它允许两个位图具有不同的像素格式。操作系统将在内部为您处理这些差异:
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)
);https://stackoverflow.com/questions/8364127
复制相似问题