Конвертация 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;
[

