Я работаю с 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];
Пожалуйста, скажите мне, где я не прав?
Хм, кое-что можно получить (введение шага строк, см. Ниже), но это не слишком много . Возможно изменение цикла 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 тоже может быть дорогостоящим, особенно если они большие, используйте пулы, чтобы избежать повторного выделения.