Конвертация TpngObject в TBitMap c вытекающей проблемой печати с использованием FastReport

Из базы получаю массив TByte в котором храниться PNG изображение (подпись сотрудника). Так как TPicture (FastReport) работает только с форматами: BMP, ICO, JPEG, WMF, EMF. Выбрал конвертировать PNG в BMP c transparentColor := clWhite;. Добавляю конвертированное BMP в TPicture, отчет (fastReport 4.10). В режиме просмотра отображается с прозрачным фоном, но при печати на некоторых конфигурациях (lexmark mx310dn, canon mf453dw) вместо подписи сотрудника отображается черный квадрат с еле видной подписью по размерам TPicture! Предполагаю, что проблема в драйвере принтеров. Чтобы заставить печать работать корректно пришла идея подкинуть белый фон вместо прозрачного. Для этого есть у меня тестовый project в котором я делаю все возможное в рамках своих знаниях, но при сохранении TBitMap в файл стандартным просмоторщиком windows этот черный фон виден т.е. игнорируется transparentColor := clWhite и соответственно распечатан будет так же. Как указать чтобы прозрачный фон стал заданным цветом.

//Модель:
type
TUserResponse = class
    id: Integer;
    imgByte: TBytes;
    png: TPngObject;
    bmp: TBitmap;
    ico :TIcon;
    constructor Create(id: Integer; imgByte: TBytes);
  end;

implementation

{ TUserResponse }

constructor TUserResponse.Create(id: Integer; imgByte: TBytes);
begin
  self.id := id;
  self.imgByte := imgByte;
  png := TPNGObject.Create;
  ico := TIcon.Create;
end;


//Реализация:
    procedure TfrmMain.Button1Click(Sender: TObject);
var
  i: integer;
  jpg: TJPEGImage;
  bmpTmp: TBitmap;
  function ByteToPng(bt: TBytes): TPngObject;
  var
    _bs: TBytesStream;
    _png: TPngObject;
  begin
    try
      if res[i].imgByte = nil then
        Result := nil
      else
      begin
        _bs := TBytesStream.Create(res[i].imgByte);
        _png := TPngObject.Create;
        with _png do
        begin
          LoadFromStream(_bs);
          SaveToFile('testPNG.png');
        end;
        Result := _png;
        _bs.Free;
      end;
    except
      begin
        _bs.Free;
        Result := nil;
      end;
    end;
  end;


begin
  memoReq.Clear;
  try
    req := TObjectList<TUser>.Create();
    req.Add(TUser.Create(32450, 95, 80));
  except
    FreeAndNil(req);
  end;


  try
    res := TObjectList<TUserResponse>.Create;
    res := GetFaksimiles(req);
    if req <> nil then
      FreeAndNil(req);
  except
    FreeAndNil(res);
    Exit;
  end;
  dsFaksimile.dataset := nil;
  With cdsFaksimile Do
  Begin
    Close;
    CreateDataSet;
    EmptyDataSet;
    For i := 0 To res.Count - 1 Do
    Begin
      res[i].png := ByteToPng(res[i].imgByte);
      res[i].bmp := TBitmap.Create;
      with res[i].bmp do
      begin
        PixelFormat := pf32Bit;
        HandleType := bmDIB;
        // Transparent := True;
        alphaformat := afDefined;
         TransparentMode := tmFixed;
         TransparentColor := clWhite;
         SetSize(res[i].png.Width, res[i].png.Height);
        Assign(res[i].png);
        SaveToFile('TestBmp.bmp');
      end;
      InsertRecord([res[i].id, res[i].bmp]);
    End;
  End;
  dsFaksimile.dataset := cdsFaksimile;
  cdsFaksimile.Open;
end;

//Отображение отчета:

    procedure TfrmMain.btnShowFaksimileClick(Sender: TObject);
begin
  (frxShowFaksimile.FindObject('picFaksimile') as TfrxPictureView)
    .Transparent := True;
  (frxShowFaksimile.FindObject('picFaksimile') as TfrxPictureView)
    .Picture.Assign(res[indexSelectedRow].bmp);
  (frxShowFaksimile.FindObject('Picture1') as TfrxPictureView)
    .Picture.Assign(res[indexSelectedRow].bmp);
  frxShowFaksimile.ShowReport();
end;

[Отображение подписи в FastReport отчете1

Печать на бумаге

Отображение в Средстве просмотра фотографий Windows


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