Немного вдохновленный подсказками LLM и старым опытом работы с RawImage (через который идёт прямое обращение к данным картинки ) написал вот такой примитивный "уменьшитель"(почему "уменьшитель"? - Потому что чем меньше размер "исходящей" картинки тем быстрее эта крякозябра работает хотя написал я её с не целью добиться какого-то ускорения, а с надеждой уменьшить обращения к WinApi в многопоточном режиме)
- Код: Выделить всё
Function ScaleNN(B:TBitmap;W,H:Integer):TBitmap;
var
SrcX,SrcY,x,y : Integer;
C:Longint;
bpp,bpl:integer;
Rbpl:integer;
PA:Pointer;
begin
Result := TBitmap.Create;
Result.PixelFormat := b.PixelFormat;
Result.SetSize(W, H);
// Вставка для теста "StretchBlt"
//========================
if StdScaleMode then begin
StretchBlt(Result.Canvas.Handle,0,0,Result.Width,Result.Height
,B.Canvas.Handle,0,0,b.Width,b.Height, SRCCOPY );
exit;
end ;
//-----------------
BPP:= B.RawImage.Description.BitsPerPixel div 8;
BPL:= B.RawImage.Description.BitsPerLine div 8;
RBPL:= Result.RawImage.Description.BitsPerLine div 8;
Result.BeginUpdate;
for X := 0 to W - 1 do begin
SrcX := trunc((X * B.Width )/ Result.Width);
for Y := 0 to H - 1 do begin
SrcY := trunc((Y * B.Height)/ Result.Height);
PA:=Pointer(B.RawImage.Data)+(BPL*SrcY)+SrcX*BPP;
move(PA^,C ,bpp);
PA:=Pointer(Result.RawImage.Data)+(rBPL*Y)+(X*BPP);
if Integer(Pa)-Integer(Result.RawImage.Data) < Result.RawImage.DataSize then
begin
move(C,PA^,bpp);
end;
end
end;
Result.EndUpdate;
end;
Однако добившись более-мнение стабильной работы решил проверить стандартное масштабирование ( с мыслю "вдруг быстрее будет" )
Результат удивил!
Тест загрузки списка 2 StdScaleMode=true
Многопоточный
Время 7,85 c
Тест загрузки списка 2 StdScaleMode=false
Многопоточный
Время 4,43 c
Тест загрузки списка 2 StdScaleMode=true
Однопоточный
Время 23,18 c
Тест загрузки списка 2 StdScaleMode=false
Однопоточный
Время 12,38 c
Спрашивается что такое делает StretchBlt чтобы работать НАСТОЛЬКО (особенно если учесть, что там не только масштабирование крутится ) медленнее ?

( Всегда считал BitBilt/StretchBlt '"эталонном оптимизации" а тут такое ... )

Зы
Хотя при работе в "сторону увеличения" ситуация может быть обратная но это вполне предсказуемо.