簡體   English   中英

如何使用Windows CopyMemory函數復制TBitmap內存

[英]How can I copy TBitmap memory using with windows CopyMemory function

我有1位圖對象witdh:1024px和高度:768 px

我想將此位圖對象切成左右兩部分,但我不想在畫布上使用DrawBitmap方法,因為此方法比CopyMemory可以使用更多的CPU。

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

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);

如果我這樣做,他可以復制位圖的左部分,但不能復制它的左部分:(他從上到下復制一半。

那張畫正是我想做的。

在此處輸入圖片說明

剪切過程后,我需要這樣而不使用任何循環(例如while或for)

在此處輸入圖片說明

謝謝

沒辦法! 如您所知,圖像數據是在存儲器中逐行布局的(因此scanline )。 您想要的只有在逐列的情況下才可能實現。 沒有任何循環,這是不可能的。

如您所見,掃描線是從左到右的一行像素。 圖像中垂直高度的每個像素都有一條掃描線。

您的1024px x 768px圖像具有768條掃描線。 從掃描線復制數據的前半部分將產生圖像的上半部分。

您無需遍歷每個像素,因為所有內容都已編入索引,因此可以跳過。

但是,由於您希望兩半都做,所以您不會浪費整個工作。 遍歷數據時,請同時復制左右兩個部分。 因此,對於第一條掃描線,將像素的前半部分復制到左側圖像,將其余像素復制到右側圖像,轉到下一行,然后重復。

這應該比DrawBitmap少工作兩次。

另外,與其加載圖像,不顯示圖像,然后將其拆分,而是在加載圖像時將其拆分。

除非您想將所有內容編寫768次,否則您仍然需要一個循環。

從技術上講,您可以旋轉圖像並按照所需的方式進行操作,但是旋轉圖像也需要循環,完成后必須將其旋轉回去。

使用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)
);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM