Skip to content

Commit 129ab70

Browse files
committed
fix: adapt to breaking changes in SixLabors.ImageSharp
1 parent f055e05 commit 129ab70

File tree

9 files changed

+143
-37
lines changed

9 files changed

+143
-37
lines changed

src/EPPlus/EPPlus/Drawing/ExcelPicture.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
using SixLabors.ImageSharp;
4040
using SixLabors.ImageSharp.Formats;
4141
using SixLabors.ImageSharp.Formats.Jpeg;
42+
using Magicodes.IE.EPPlus;
4243

4344
namespace OfficeOpenXml.Drawing
4445
{
@@ -59,7 +60,9 @@ internal ExcelPicture(ExcelDrawings drawings, XmlNode node) :
5960
UriPic = UriHelper.ResolvePartUri(drawings.UriDrawing, RelPic.TargetUri);
6061

6162
Part = drawings.Part.Package.GetPart(UriPic);
62-
Image = Image.Load(Part.GetStream(), out var format);
63+
// Image = Image.Load(Part.GetStream(), out var format);
64+
Image = Image.Load(Part.GetStream());
65+
var format = Image.GetImageFormat(Part.GetStream());
6366
ImageFormat = format;
6467
byte[] iby = ImageCompat.GetImageAsByteArray(Image, format);
6568
var ii = _drawings._package.LoadImage(iby, UriPic, Part);
@@ -119,7 +122,9 @@ internal ExcelPicture(ExcelDrawings drawings, XmlNode node, FileInfo imageFile,
119122
var package = drawings.Worksheet._package.Package;
120123
using (var imageStream = new FileStream(imageFile.FullName, FileMode.Open, FileAccess.Read))
121124
{
122-
Image = Image.Load(imageStream, out var format);
125+
// Image = Image.Load(imageStream, out var format);
126+
Image = Image.Load(imageStream);
127+
var format = Image.GetImageFormat(imageStream);
123128
ImageFormat = format;
124129

125130
var img = ImageCompat.GetImageAsByteArray(Image, format);

src/EPPlus/EPPlus/ExcelBackgroundImage.cs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
using System.Xml;
3838
using SixLabors.ImageSharp;
3939
using SixLabors.ImageSharp.Formats;
40+
using Magicodes.IE.EPPlus;
4041

4142
namespace OfficeOpenXml
4243
{
@@ -77,9 +78,14 @@ public void SetImage(byte[] imageBytes = null)
7778
DeleteAllNode(BACKGROUNDPIC_PATH);
7879
return;
7980
}
81+
Image = Image.Load(imageBytes);
82+
//Image = Image.Load(imageBytes, out var imageFormat);
83+
using (MemoryStream imageStream = new MemoryStream(imageBytes))
84+
{
85+
var imageFormat = Image.GetImageFormat(imageStream);
86+
ImageFormat = imageFormat;
87+
}
8088

81-
Image = Image.Load(imageBytes, out var imageFormat);
82-
ImageFormat = imageFormat;
8389
var imageInfo = _workSheet.Workbook._package.AddImage(imageBytes);
8490
var rel = _workSheet.Part.CreateRelationship(imageInfo.Uri, Packaging.TargetMode.Internal,
8591
ExcelPackage.schemaRelationships + "/image");
@@ -98,7 +104,9 @@ public void SetFromFile(FileInfo pictureFile)
98104
try
99105
{
100106
var fileBytes = File.ReadAllBytes(pictureFile.FullName);
101-
Image.Load(fileBytes, out var format);
107+
//Image.Load(fileBytes, out var format);
108+
var format = Image.DetectFormat(fileBytes);
109+
102110
string contentType = format.DefaultMimeType;
103111
var imageUri = XmlHelper.GetNewUri(_workSheet._package.Package,
104112
"/xl/media/" +

src/EPPlus/EPPlus/ExcelHeaderFooter.cs

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@
4040
using System.Xml;
4141
using SixLabors.ImageSharp;
4242
using SixLabors.ImageSharp.Formats;
43+
using System.Reflection;
44+
using Magicodes.IE.EPPlus;
4345

4446
namespace OfficeOpenXml
4547
{
@@ -150,15 +152,22 @@ public ExcelVmlDrawingPicture InsertPicture(FileInfo pictureFile, PictureAlignme
150152
{
151153
throw (new FileNotFoundException(string.Format("{0} is missing", pictureFile.FullName)));
152154
}
153-
Picture = Image.Load(pictureFile.FullName, out var format);
154-
string contentType = format.DefaultMimeType;
155-
var uriPic = XmlHelper.GetNewUri(_ws._package.Package, "/xl/media/" + pictureFile.Name.Substring(0, pictureFile.Name.Length - pictureFile.Extension.Length) + "{0}" + pictureFile.Extension);
156-
var imgBytes = ImageCompat.GetImageAsByteArray(Picture, format);
155+
156+
// Picture = Image.Load(pictureFile.FullName, out var format);
157+
Picture = Image.Load(pictureFile.FullName);
158+
using (Stream imageStream = pictureFile.OpenRead())
159+
{
160+
var format = Picture.GetImageFormat(imageStream);
161+
string contentType = format.DefaultMimeType;
162+
var uriPic = XmlHelper.GetNewUri(_ws._package.Package, "/xl/media/" + pictureFile.Name.Substring(0, pictureFile.Name.Length - pictureFile.Extension.Length) + "{0}" + pictureFile.Extension);
163+
var imgBytes = ImageCompat.GetImageAsByteArray(Picture, format);
157164

158165

159-
var ii = _ws.Workbook._package.AddImage(imgBytes, uriPic, contentType);
166+
var ii = _ws.Workbook._package.AddImage(imgBytes, uriPic, contentType);
160167

161-
return AddImage(Picture, format, id, ii);
168+
return AddImage(Picture, format, id, ii);
169+
}
170+
162171
}
163172
catch (Exception ex)
164173
{

src/EPPlus/EPPlus/Magicodes.IE.EPPlus.csproj

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,19 +58,19 @@
5858
</ItemGroup>
5959

6060
<ItemGroup Condition="'$(TargetFramework)' == 'net6.0'">
61-
<PackageReference Include="SixLabors.ImageSharp" Version="2.1.3" />
61+
<PackageReference Include="SixLabors.ImageSharp" Version="3.0.0" />
6262
<PackageReference Include="System.Security.Cryptography.Pkcs" Version="6.0.1" />
6363
<PackageReference Include="System.Text.Encoding.CodePages" Version="6.0.0" />
6464
</ItemGroup>
6565

6666
<ItemGroup Condition="'$(TargetFramework)' == 'net7.0'">
67-
<PackageReference Include="SixLabors.ImageSharp" Version="2.1.3" />
67+
<PackageReference Include="SixLabors.ImageSharp" Version="3.0.0" />
6868
<PackageReference Include="System.Security.Cryptography.Pkcs" Version="7.0.1" />
6969
<PackageReference Include="System.Text.Encoding.CodePages" Version="7.0.0" />
7070
</ItemGroup>
7171

7272
<ItemGroup Condition="'$(TargetFramework)' == 'net8.0'">
73-
<PackageReference Include="SixLabors.ImageSharp" Version="2.1.3" />
73+
<PackageReference Include="SixLabors.ImageSharp" Version="3.0.0" />
7474
<PackageReference Include="System.Security.Cryptography.Pkcs" Version="8.0.0" />
7575
<PackageReference Include="System.Text.Encoding.CodePages" Version="8.0.0" />
7676
</ItemGroup>
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
using System.IO;
2+
using SixLabors.ImageSharp;
3+
using SixLabors.ImageSharp.Formats.Bmp;
4+
using SixLabors.ImageSharp.Formats.Gif;
5+
using SixLabors.ImageSharp.Formats.Jpeg;
6+
using SixLabors.ImageSharp.Formats.Png;
7+
using SixLabors.ImageSharp.Formats;
8+
9+
namespace Magicodes.IE.EPPlus
10+
{
11+
public static partial class ImageExtensions
12+
{
13+
public static IImageFormat GetImageFormat(this Image image, Stream imageStream)
14+
{
15+
var metadataProperty = image.Metadata.GetType().GetProperty("DecodedImageFormat");
16+
if (metadataProperty != null)
17+
{
18+
return metadataProperty.GetValue(image.Metadata) as IImageFormat;
19+
}
20+
else
21+
{
22+
byte[] header = new byte[4];
23+
long originalPosition = imageStream.Position;
24+
25+
imageStream.Position = 0;
26+
imageStream.Read(header, 0, header.Length);
27+
imageStream.Position = originalPosition;
28+
29+
if (header[0] == 0x89 && header[1] == 0x50 && header[2] == 0x4E && header[3] == 0x47)
30+
{
31+
return PngFormat.Instance;
32+
}
33+
if (header[0] == 0xFF && header[1] == 0xD8)
34+
{
35+
return JpegFormat.Instance;
36+
}
37+
if (header[0] == 0x47 && header[1] == 0x49 && header[2] == 0x46)
38+
{
39+
return GifFormat.Instance;
40+
}
41+
if (header[0] == 0x42 && header[1] == 0x4D)
42+
{
43+
return BmpFormat.Instance;
44+
}
45+
return null;
46+
}
47+
}
48+
}
49+
}

src/Magicodes.ExporterAndImporter.Core/Magicodes.IE.Core.csproj

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,19 +27,19 @@
2727
</ItemGroup>
2828

2929
<ItemGroup Condition=" '$(TargetFramework)' == 'net6.0' ">
30-
<PackageReference Include="SixLabors.ImageSharp" Version="2.1.3" />
30+
<PackageReference Include="SixLabors.ImageSharp" Version="3.0.0" />
3131
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="6.0.0" />
3232
<PackageReference Include="Microsoft.Extensions.DependencyModel" Version="6.0.0" />
3333
</ItemGroup>
3434

3535
<ItemGroup Condition=" '$(TargetFramework)' == 'net7.0' ">
36-
<PackageReference Include="SixLabors.ImageSharp" Version="2.1.3" />
36+
<PackageReference Include="SixLabors.ImageSharp" Version="3.0.0" />
3737
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="7.0.0" />
3838
<PackageReference Include="Microsoft.Extensions.DependencyModel" Version="7.0.0" />
3939
</ItemGroup>
4040

4141
<ItemGroup Condition=" '$(TargetFramework)' == 'net8.0' ">
42-
<PackageReference Include="SixLabors.ImageSharp" Version="2.1.3" />
42+
<PackageReference Include="SixLabors.ImageSharp" Version="3.0.0" />
4343
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.0" />
4444
<PackageReference Include="Microsoft.Extensions.DependencyModel" Version="8.0.0" />
4545
</ItemGroup>

src/Magicodes.ExporterAndImporter.Excel/Images/ImageExtensions.cs

Lines changed: 42 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,17 @@
44
using SixLabors.ImageSharp;
55
using SixLabors.ImageSharp.Formats;
66
using SixLabors.ImageSharp.Metadata;
7+
using SkiaSharp;
8+
using SixLabors.ImageSharp.PixelFormats;
9+
using SixLabors.ImageSharp.Advanced;
10+
using SixLabors.ImageSharp.Metadata.Profiles.Exif;
11+
using Magicodes.IE.EPPlus;
12+
using SixLabors.ImageSharp.Memory;
13+
using System.Text.RegularExpressions;
714

815
namespace Magicodes.IE.Excel.Images
916
{
10-
internal static class ImageExtensions
17+
internal static partial class ImageExtensions
1118
{
1219
public static string SaveTo(this Image image, string path)
1320
{
@@ -39,34 +46,52 @@ public static Image GetImageByUrl(this string url, out IImageFormat format)
3946
using (var wc = new WebClient())
4047
{
4148
wc.Proxy = null;
42-
var image = Image.Load(wc.OpenRead(url), out format);
43-
if (image.Metadata.HorizontalResolution == 0 && image.Metadata.VerticalResolution == 0)
49+
using (Stream webStream = wc.OpenRead(url))
4450
{
45-
image.Metadata.HorizontalResolution = ImageMetadata.DefaultHorizontalResolution;
46-
image.Metadata.VerticalResolution = ImageMetadata.DefaultVerticalResolution;
51+
using (MemoryStream memoryStream = new MemoryStream())
52+
{
53+
webStream.CopyTo(memoryStream);
54+
memoryStream.Position = 0;
55+
56+
var image = Image.Load(memoryStream);
57+
format = image.GetImageFormat(memoryStream);
58+
59+
if (image.Metadata.HorizontalResolution == 0 && image.Metadata.VerticalResolution == 0)
60+
{
61+
image.Metadata.HorizontalResolution = ImageMetadata.DefaultHorizontalResolution;
62+
image.Metadata.VerticalResolution = ImageMetadata.DefaultVerticalResolution;
63+
}
64+
return image;
65+
}
4766
}
48-
return image;
4967
}
5068
}
5169

5270
/// <summary>
53-
/// base64转Bitmap
71+
/// Converts a base64 string to an Image
5472
/// </summary>
55-
/// <param name="base64String"></param>
56-
/// <param name="format"></param>
57-
/// <returns></returns>
73+
/// <param name="base64String">The base64 string representing the image</param>
74+
/// <param name="format">The image format</param>
75+
/// <returns>An Image object representing the base64 string</returns>
5876
public static Image Base64StringToImage(this string base64String, out IImageFormat format)
5977
{
60-
var bytes = Convert.FromBase64String(FixBase64ForImage(base64String));
61-
return Image.Load(bytes, out format);
78+
byte[] bytes = Convert.FromBase64String(CleanupBase64String(base64String));
79+
using (MemoryStream stream = new MemoryStream(bytes))
80+
{
81+
Image image = Image.Load(stream);
82+
format = image.GetImageFormat(stream);
83+
return image;
84+
}
6285
}
6386

64-
private static string FixBase64ForImage(string image)
87+
/// <summary>
88+
/// Cleans up the base64 string by removing unnecessary characters
89+
/// </summary>
90+
/// <param name="base64String">The base64 string to clean up</param>
91+
/// <returns>A cleaned-up base64 string</returns>
92+
private static string CleanupBase64String(string base64String)
6593
{
66-
var sbText = new System.Text.StringBuilder(image, image.Length);
67-
sbText.Replace("\r\n", string.Empty);
68-
sbText.Replace(" ", string.Empty);
69-
return sbText.ToString();
94+
return Regex.Replace(base64String, @"\s+", string.Empty);
7095
}
7196
}
7297
}

src/Magicodes.ExporterAndImporter.Excel/Utility/ImportHelper.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -778,7 +778,8 @@ protected virtual void ParseTemplate(ExcelPackage excelPackage)
778778
/// 解析头部
779779
/// </summary>
780780
/// <returns></returns>
781-
/// <exception cref = "ArgumentException" > 导入实体没有定义ImporterHeader属性 </ exception >
781+
/// <exception cref = "ArgumentException" > 导入实体没有定义ImporterHeader属性
782+
/// </exception>
782783
protected virtual bool ParseHeader()
783784
{
784785
ImporterHeaderInfos = new List<ImporterHeaderInfo>();

src/Magicodes.ExporterAndImporter.Excel/Utility/TemplateExport/TemplateExportHelper.cs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@
2626
using Magicodes.IE.Excel.Images;
2727
using SixLabors.ImageSharp;
2828
using SixLabors.ImageSharp.Formats;
29+
using SkiaSharp;
30+
using Magicodes.IE.EPPlus;
31+
using System.Reflection;
2932

3033
namespace Magicodes.ExporterAndImporter.Excel.Utility.TemplateExport
3134
{
@@ -696,7 +699,13 @@ private bool RenderCellPipeline(Interpreter target, ExcelWorksheet sheet, ref st
696699
}
697700
else if (File.Exists(imageUrl))
698701
{
699-
image = Image.Load(imageUrl, out format);
702+
using (Stream imageStream = File.OpenRead(imageUrl))
703+
{
704+
image = Image.Load(imageStream);
705+
format = image.GetImageFormat(imageStream);
706+
}
707+
708+
// image = Image.Load(imageUrl, out format);
700709
}
701710

702711
if (image == null)
@@ -719,7 +728,7 @@ private bool RenderCellPipeline(Interpreter target, ExcelWorksheet sheet, ref st
719728
excelImage.SetSize(width, height);
720729
}
721730
}
722-
catch (Exception)
731+
catch (Exception ex)
723732
{
724733
cell.Value = alt;
725734
}

0 commit comments

Comments
 (0)