From 93b4393d8671f9a9594296cfee841eb0ee44fd9e Mon Sep 17 00:00:00 2001 From: wp_xxyyzz Date: Sun, 26 Jun 2022 17:38:08 +0000 Subject: [PATCH] fpspreadsheet: Support image scaling factor when reading images from xlsx. git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@8328 8e941d3f-bd1b-0410-a28a-d453659cc2b4 --- .../fpspreadsheet/source/common/xlsxooxml.pas | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/components/fpspreadsheet/source/common/xlsxooxml.pas b/components/fpspreadsheet/source/common/xlsxooxml.pas index d1034c5a8..3c67921d7 100644 --- a/components/fpspreadsheet/source/common/xlsxooxml.pas +++ b/components/fpspreadsheet/source/common/xlsxooxml.pas @@ -2663,6 +2663,9 @@ var data: TEmbeddedObjData; SheetRels: TStrings; sheetData: TSheetData; + w, h: Double; + img: TsEmbeddedObj; + scaleX, scaleY: Double; begin SheetRels := TStringList.Create; try @@ -2735,11 +2738,27 @@ begin data := TEmbeddedObjData(FEmbeddedObjList[i]); sheet := TsWorksheet(data.Worksheet); if (sheet <> nil) and (data.ImgIndex > -1) then + begin + img := TsWorkbook(FWorkbook).GetEmbeddedObj(data.ImgIndex); + w := -data.FromColOffs + data.ToColOffs; + h := -data.FromRowOffs + data.ToRowOffs; + for j := data.FromCol to data.ToCol-1 do + w := w + sheet.GetColWidth(j, suMillimeters); + for j := data.FromRow to data.ToRow-1 do + h := h + sheet.GetRowHeight(j, suMillimeters); + scaleX := w / img.ImageWidth; + scaleY := h / img.ImageHeight; + // Scale factor calculation is very inaccurate. We try to round to integers + if (scaleX > 0.99) and SameValue(scaleX, round(scaleX), 0.01) then + scaleX := round(scaleX); + if (scaleY > 0.99) and SameValue(scaleY, round(scaleY), 0.01) then + scaleY := round(scaleY); sheet.WriteImage(data.FromRow, data.FromCol, data.ImgIndex, - data.FromRowOffs, data.FromColOffs + data.FromRowOffs, data.FromColOffs, + scaleX, scaleY ); - // to do: ScaleX, ScaleY, ASize + end; end; finally doc.Free;