TBitmap.ScanLine [] занимает слишком много времени для выполнения

Я работаю с Delphi. Я использую bmp.ScanLine [] в моем коде. Мой код выглядит следующим образом:

   bmp := TBitmap.Create;
   bmp.Height := imgMain.Height;
   bmp.Width := imgMain.Width;
   for i := 0 to imgMain.Height - 1 do begin
      prgb := bmp.ScanLine[i];
      p1 := imgMain.ScanLine[i];
      for j := 0 to imgMain.Width - 1 do begin
         //Some code
      end;
   end;

Здесь imgMain имеет тип TBitmap. Моя проблема в том, что когда я выполняю этот код, это занимает слишком много времени в строках

prgb := bmp.ScanLine[i];
p1 := imgMain.ScanLine[i];

Пожалуйста, скажите мне, где я не прав?

1
задан Himadri 17 August 2010 в 06:36
поделиться

1 ответ

Хм, кое-что можно получить (введение шага строк, см. Ниже), но это не слишком много . Возможно изменение цикла for на цикл while, который увеличивает указатель и сравнивает его со значением указателя последнего пикселя

   // from memory, might need an additional typecast here or there.

   // will typically be negative
   scanline0:=imga.scanline[0];
   rowpitchimga:=integer(imga.scanline[1])-integer(scanline0);  // bytes to jump row.

   prgb1 :=scanline0;
   for i:=0 to imgmain.height-1;
     begin
       prgbend:=prgb1;
       inc(prgbend,width);  // if prgbend, it will be with sizeof(prgb1^)
       while(prgb1<prbend) do // smaller then, since prgb1[] is 0 based.
         begin
           // do your thing
           inc(prgb1);
         end;      
       prgb1:=prgbend;
       inc(pointer(prgb1),rowpitch-width*sizeof(prgb1^));  // skip alignmentbytes
       inc(pointer(prgbend),rowpitch);
     end;

См. Также вращающиеся растровые изображения. В коде подпрограммы, которая выполняет подобные действия для быстрого поворота изображения.

Постоянное выделение bmps тоже может быть дорогостоящим, особенно если они большие, используйте пулы, чтобы избежать повторного выделения.

2
ответ дан 2 September 2019 в 22:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: