Полагаю, что "глупое" преобразование будет таким простым:
type
TGraphicTypeEnum = (gteBMP, gteJPG, gteTIF, gtePNG);
procedure SaveGraphicAs(AGraphic : TGraphic; AGraphicType : TGraphicTypeEnum; AFileName : String);
var vGraphicClass : TGraphicClass;
vTargetGraphic : TGraphic;
vBmp : TBitmap;
begin
case AGraphicType of
gteBMP : vGraphicClass := TBitmap;
gtejpg : vGraphicClass := TJPEGImage;
gtetif : vGraphicClass := TWICImage;
gtepng : vGraphicClass := TPngImage;
else
// EXIT; or raise...
end;
if aGraphic is vGraphicClass then //As suggested by Rob Kennedy
AGraphic.SaveToFile(AFileName)
else
begin
vBmp := nil;
vTargetGraphic := vGraphicClass.Create;
try
vBmp := TBitmap.Create;
vBmp.Assign(AGraphic);
vTargetGraphic.Assign(vBmp);
vTargetGraphic.SaveToFile(aFileName);
finally
vTargetGraphic.Free;
vBmp.Free;
end;
end;
end;
Присвоение TPicture не сработало, так как при назначении TPicture TPicture преобразует рисунок в класс, из которого вы назначаете.
Обратите внимание, что в моем примере есть 2 слоя преобразования, поскольку исходное изображение преобразуется в растровое изображение перед преобразованием в окончательный формат. При этом может происходить небольшая потеря информации. Большинство (все?) Графических типов знают, как конвертировать в TBitmap и из TBitmap, но TJPEGImage не знает, как конвертировать в TPngImage и наоборот.
Может быть разработан более эффективный метод преобразования, который сохраняет прозрачность и другие эффекты, специфичные для формата файла, но это вне моих знаний. Но, в зависимости от ваших потребностей, этого может быть достаточно.