Skip to content

Commit 6261258

Browse files
xufengBobLd
authored andcommitted
Fix bug in PngFromPdfImageFactory where softmask is wrongly referenced.
1 parent bf664c3 commit 6261258

File tree

4 files changed

+40
-12
lines changed

4 files changed

+40
-12
lines changed
Binary file not shown.
78.6 KB
Loading

src/UglyToad.PdfPig.Tests/Images/PngFromPdfImageFactoryTests.cs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,30 @@ public void CanGeneratePngFromIndexedImageData8bpc()
103103
Assert.True(ImageHelpers.ImagesAreEqual(LoadImage("3x3.png"), bytes));
104104
}
105105

106+
[Fact]
107+
public void CanExtractPngFromPdfWithIndexedImageData8bpc()
108+
{
109+
var documetFolder = Path.GetFullPath(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "..", "..", "..", "Images", "Files"));
110+
111+
var pdfPath = Path.Combine(documetFolder, "Pdf", "indexed-png-with-mask.pdf");
112+
113+
using (PdfDocument document = PdfDocument.Open(pdfPath))
114+
{
115+
var page = document.GetPage(1);
116+
117+
var img = page.GetImages().First();
118+
119+
var result = img.TryGetPng(out var bytes);
120+
121+
if (result)
122+
{
123+
var outputPath = Path.Combine(documetFolder, "Pdf", "indexed-png-with-mask.png");
124+
125+
File.WriteAllBytes(outputPath, bytes);
126+
}
127+
}
128+
}
129+
106130
[Fact]
107131
public void CanGeneratePngFromIndexedImageData1bpc()
108132
{

src/UglyToad.PdfPig/Images/Png/PngFromPdfImageFactory.cs

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,36 +7,40 @@
77

88
internal static class PngFromPdfImageFactory
99
{
10-
private static bool TryGenerateSoftMask(IPdfImage image, [NotNullWhen(true)] out ReadOnlySpan<byte> bytes)
10+
private static bool TryGenerateSoftMask(IPdfImage image, [NotNullWhen(true)] out ReadOnlySpan<byte> maskBytes)
1111
{
12-
bytes = ReadOnlySpan<byte>.Empty;
12+
maskBytes = ReadOnlySpan<byte>.Empty;
1313

14-
if (image.MaskImage is null)
14+
var mask = image.MaskImage;
15+
16+
if (mask is null)
1517
{
1618
return false;
1719
}
1820

1921
// Because we cannot resize images directly in PdfPig, we only
2022
// apply the mask if it has the same size as the image
21-
if (image.HeightInSamples != image.MaskImage.HeightInSamples ||
22-
image.WidthInSamples != image.MaskImage.WidthInSamples)
23+
if (image.HeightInSamples != mask.HeightInSamples ||
24+
image.WidthInSamples != mask.WidthInSamples)
2325
{
2426
return false;
2527
}
2628

27-
if (!image.TryGetBytesAsMemory(out var imageMemory))
29+
if (!mask.TryGetBytesAsMemory(out var maskMemory))
2830
{
2931
return false;
3032
}
3133

3234
try
3335
{
34-
bytes = ColorSpaceDetailsByteConverter.Convert(image.ColorSpaceDetails!,
35-
imageMemory.Span,
36-
image.BitsPerComponent,
37-
image.WidthInSamples,
38-
image.HeightInSamples);
39-
return IsCorrectlySized(image, bytes);
36+
maskBytes = ColorSpaceDetailsByteConverter.Convert(
37+
mask.ColorSpaceDetails!,
38+
maskMemory.Span,
39+
mask.BitsPerComponent,
40+
mask.WidthInSamples,
41+
mask.HeightInSamples);
42+
43+
return IsCorrectlySized(mask, maskBytes);
4044
}
4145
catch (Exception)
4246
{

0 commit comments

Comments
 (0)