Немного вдохновленный подсказками 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 '"эталонном оптимизации" а тут такое ... )

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


