Загрузка 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-ти.

Подскажите, что не так? Как правильно загрузить картинку без потери качества?


Ответы (0 шт):