Господа, спасибо за участие!
zairkz, упростил и немного подправил ваш код, вот что получилось:
procedure TSiteExchangerThread.RescalePhoto(const FileName: string);
const
DefaultHeight = 300;
var
Bitmap: TBitmap;
Thumb: TBitmap;
BSS: TBitmapCodecSaveParams;
xScale: Double;
newWidth, newHeight: integer;
begin
Bitmap := TBitmap.Create;
try
try
Bitmap.LoadFromFile(FileName);
if Bitmap.Height <> DefaultHeight then
begin
xScale := Bitmap.Height / DefaultHeight;
newHeight := DefaultHeight;
newWidth := Round(Bitmap.Width / xScale);
Thumb := Bitmap.CreateThumbnail(newWidth, newHeight); // далее работаем с Thumb, а не с Bitmap
try
BSS.Quality := 90;
Thumb.SaveToFile(FileName, @BSS); // все менеджеры и surface не нужны, они есть внутри Save-метода
finally
Thumb.Free;
end;
end;
except
DeleteFile(FileName);
raise;
end;
finally
Bitmap.Free;
end;
end;
Кстати, весьма удивился, что результат получился нужный: TBitmap.Resize использует тот же самый CreateThumbnail. Единственное отличие - в Resize-методе используется Assign получившегося thumb-а в себя же. А вот в самом assign какие-то непонятные манипуляции со счетчиками ссылок FImage. Имхо, именно здесь и возникает проблема с белым прямоугольником, ибо все остальное - 1:1 уже используемое в методах TBitmap