Загрузка PNG изображения в Direct2D без потери качества
Возникла проблема с загрузкой изображения из PNG с разрешением 192dpi. Я загружаю картинку в WICImage, после чего преобразовываю её в ID2D1Bitmap через конвертер. При этом у меня либо срезается DPI до 96, либо в два раза уменьшается размер итоговой картинки. В обоих случаях это приводит к снижению качества изображения.
Код загрузки изображения такой:
...
private
FRenderTarget: ID2D1HwndRenderTarget;
FBitmapD2D: ID2D1Bitmap;
end;
...
procedure TPrimitiveBitmap.LoadBitmapDX(AStream: TStream);
var
TmpWicFactory: IWICImagingFactory;
TmpWicImage: TWICImage;
TmpConverter: IWICFormatConverter;
TmpProperties: TD2D1BitmapProperties;
TmpDpiX: Double;
TmpDpiY: Double;
begin
TmpWICImage := TWICImage.Create();
try
// Читаем картинку из потока
TmpWicImage.LoadFromStream(AStream);
// Получаем фабрику
TmpWicFactory := TmpWicImage.ImagingFactory;
// Создаём и инициализируем конвертер
TmpWicFactory.CreateFormatConverter(TmpConverter);
TmpConverter.Initialize(TmpWicImage.Handle,
GUID_WICPixelFormat32bppPBGRA,
WICBitmapDitherTypeNone,
nil,
0,
WICBitmapPaletteTypeMedianCut);
// Получаем текущее разрешение картинки
TmpConverter.GetResolution(TmpDpiX, TmpDpiY);
// Это разрешение будем применять при конвертации, иначе будет установлено разрешение по умолчанию - 96 DPI
TmpProperties.pixelFormat := D2D1PixelFormat();
TmpProperties.dpiX := TmpDpiX;
TmpProperties.dpiY := TmpDpiY;
// Конвертируем изображение в ID2D1Bitmap
FRenderTarget.CreateBitmapFromWicBitmap(TmpConverter, @TmpProperties, FBitmapD2D);
// За размеры изображения возьмём изначальные размеры. Однако после конвертации у итогового изображения размеры
// уменьшены в два раза. Это проблема.
FSize := TSizeF.Create(TmpWicImage.Width, TmpWicImage.Height);
FResolution := TPointF.Create(TmpDpiX, TmpDpiX);
finally
TmpConverter := nil;
TmpWicFactory := nil;
FreeAndNil(TmpWICImage);
end;
end;
В данном случае разрешение в 192 DPI будет сохранено, но размеры уменьшатся в два раза. Если же в методе CreateBitmapFromWicBitmap не передавать TmpProperties (поставить nil), то у итоговой картинки размеры сохранятся, но DPI срежется до 96-ти.
Подскажите, что не так? Как правильно загрузить картинку без потери качества?