Use Sixlabors.Imagesharp for resizing coverimages.

This commit is contained in:
Glax 2024-10-18 19:30:57 +02:00
parent 00c4f0533f
commit 1a631362c9
4 changed files with 22 additions and 21 deletions

View File

@ -90,6 +90,7 @@ That is why I wanted to create my own project, in a language I understand, and t
- [PuppeteerSharp](https://www.puppeteersharp.com/) - [PuppeteerSharp](https://www.puppeteersharp.com/)
- [Html Agility Pack (HAP)](https://html-agility-pack.net/) - [Html Agility Pack (HAP)](https://html-agility-pack.net/)
- [Soenneker.Utils.String.NeedlemanWunsch](https://github.com/soenneker/soenneker.utils.string.needlemanwunsch) - [Soenneker.Utils.String.NeedlemanWunsch](https://github.com/soenneker/soenneker.utils.string.needlemanwunsch)
- [Sixlabors.ImageSharp](https://docs-v2.sixlabors.com/articles/imagesharp/index.html#license)
- 💙 Blåhaj 🦈 - 💙 Blåhaj 🦈
<p align="right">(<a href="#readme-top">back to top</a>)</p> <p align="right">(<a href="#readme-top">back to top</a>)</p>

View File

@ -3,6 +3,8 @@ using System.Runtime.InteropServices;
using System.Text; using System.Text;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using Newtonsoft.Json; using Newtonsoft.Json;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Formats.Png;
namespace Tranga.Server; namespace Tranga.Server;
@ -26,13 +28,13 @@ public partial class Server : GlobalBase, IDisposable
new ("GET", @"/v2/Mangas", GetV2Mangas), new ("GET", @"/v2/Mangas", GetV2Mangas),
new ("GET", @"/v2/Manga/Search", GetV2MangaSearch), new ("GET", @"/v2/Manga/Search", GetV2MangaSearch),
new ("GET", @"/v2/Manga", GetV2Manga), new ("GET", @"/v2/Manga", GetV2Manga),
new ("GET", @"/v2/Manga/([-A-Za-z0-9]*={0,3})", GetV2MangaInternalId),
new ("DELETE", @"/v2/Manga/([-A-Za-z0-9]*={0,3})", DeleteV2MangaInternalId),
new ("GET", @"/v2/Manga/([-A-Za-z0-9]*={0,3})/Cover", GetV2MangaInternalIdCover), new ("GET", @"/v2/Manga/([-A-Za-z0-9]*={0,3})/Cover", GetV2MangaInternalIdCover),
new ("GET", @"/v2/Manga/([-A-Za-z0-9]*={0,3})/Chapters", GetV2MangaInternalIdChapters), new ("GET", @"/v2/Manga/([-A-Za-z0-9]*={0,3})/Chapters", GetV2MangaInternalIdChapters),
new ("GET", @"/v2/Manga/([-A-Za-z0-9]*={0,3})/Chapters/Latest", GetV2MangaInternalIdChaptersLatest), new ("GET", @"/v2/Manga/([-A-Za-z0-9]*={0,3})/Chapters/Latest", GetV2MangaInternalIdChaptersLatest),
new ("POST", @"/v2/Manga/([-A-Za-z0-9]*={0,3})/ignoreChaptersBelow", PostV2MangaInternalIdIgnoreChaptersBelow), new ("POST", @"/v2/Manga/([-A-Za-z0-9]*={0,3})/ignoreChaptersBelow", PostV2MangaInternalIdIgnoreChaptersBelow),
new ("POST", @"/v2/Manga/([-A-Za-z0-9]*={0,3})/moveFolder", PostV2MangaInternalIdMoveFolder), new ("POST", @"/v2/Manga/([-A-Za-z0-9]*={0,3})/moveFolder", PostV2MangaInternalIdMoveFolder),
new ("GET", @"/v2/Manga/([-A-Za-z0-9]*={0,3})", GetV2MangaInternalId),
new ("DELETE", @"/v2/Manga/([-A-Za-z0-9]*={0,3})", DeleteV2MangaInternalId),
new ("GET", @"/v2/Jobs", GetV2Jobs), new ("GET", @"/v2/Jobs", GetV2Jobs),
new ("GET", @"/v2/Jobs/Running", GetV2JobsRunning), new ("GET", @"/v2/Jobs/Running", GetV2JobsRunning),
new ("GET", @"/v2/Jobs/Waiting", GetV2JobsWaiting), new ("GET", @"/v2/Jobs/Waiting", GetV2JobsWaiting),
@ -205,10 +207,15 @@ public partial class Server : GlobalBase, IDisposable
{ {
if (content is Stream stream) if (content is Stream stream)
{ {
response.ContentType = "image/jpeg"; response.ContentType = "text/plain";
response.AddHeader("Cache-Control", "max-age=600");
stream.CopyTo(response.OutputStream); stream.CopyTo(response.OutputStream);
stream.Close(); stream.Close();
}else if (content is Image image)
{
response.ContentType = image.Metadata.DecodedImageFormat?.DefaultMimeType ?? PngFormat.Instance.DefaultMimeType;
response.AddHeader("Cache-Control", "max-age=600");
image.Save(response.OutputStream, image.Metadata.DecodedImageFormat ?? PngFormat.Instance);
image.Dispose();
} }
else else
{ {

View File

@ -1,5 +1,5 @@
using System.Drawing; using SixLabors.ImageSharp;
using System.Drawing.Imaging; using SixLabors.ImageSharp.Processing;
using System.Net; using System.Net;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using Tranga.Jobs; using Tranga.Jobs;
@ -82,7 +82,7 @@ public partial class Server
if(!File.Exists(filePath)) if(!File.Exists(filePath))
return new ValueTuple<HttpStatusCode, object?>(HttpStatusCode.NotFound, "Cover-File not found."); return new ValueTuple<HttpStatusCode, object?>(HttpStatusCode.NotFound, "Cover-File not found.");
Bitmap bitmap; Image image = Image.Load(filePath);
if (requestParameters.TryGetValue("dimensions", out string? dimensionsStr)) if (requestParameters.TryGetValue("dimensions", out string? dimensionsStr))
{ {
Regex dimensionsRex = new(@"([0-9]+)x([0-9]+)"); Regex dimensionsRex = new(@"([0-9]+)x([0-9]+)");
@ -93,23 +93,15 @@ public partial class Server
int height = int.Parse(m.Groups[2].Value); int height = int.Parse(m.Groups[2].Value);
double aspectRequested = (double)width / (double)height; double aspectRequested = (double)width / (double)height;
using Image coverImage = Image.FromFile(filePath); double aspectCover = (double)image.Width / (double)image.Height;
double aspectCover = (double)coverImage.Width / (double)coverImage.Height;
Size newSize = aspectRequested > aspectCover Size newSize = aspectRequested > aspectCover
? new Size(width, (width / coverImage.Width) * coverImage.Height) ? new Size(width, (width / image.Width) * image.Height)
: new Size((height / coverImage.Height) * coverImage.Width, height); : new Size((height / image.Height) * image.Width, height);
bitmap = new(coverImage, newSize); image.Mutate(x => x.Resize(newSize));
} }
else return new ValueTuple<HttpStatusCode, object?>(HttpStatusCode.OK, image);
{
FileStream coverStream = new(filePath, FileMode.Open);
bitmap = new(coverStream);
}
using MemoryStream ret = new();
bitmap.Save(ret, ImageFormat.Jpeg);
return new ValueTuple<HttpStatusCode, object?>(HttpStatusCode.OK, ret);
} }
private ValueTuple<HttpStatusCode, object?> GetV2MangaInternalIdChapters(GroupCollection groups, Dictionary<string, string> requestParameters) private ValueTuple<HttpStatusCode, object?> GetV2MangaInternalIdChapters(GroupCollection groups, Dictionary<string, string> requestParameters)

View File

@ -13,6 +13,7 @@
<PackageReference Include="HtmlAgilityPack" Version="1.11.46" /> <PackageReference Include="HtmlAgilityPack" Version="1.11.46" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" /> <PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="PuppeteerSharp" Version="10.0.0" /> <PackageReference Include="PuppeteerSharp" Version="10.0.0" />
<PackageReference Include="SixLabors.ImageSharp" Version="3.1.5" />
<PackageReference Include="Soenneker.Utils.String.NeedlemanWunsch" Version="2.1.301" /> <PackageReference Include="Soenneker.Utils.String.NeedlemanWunsch" Version="2.1.301" />
<PackageReference Include="System.Drawing.Common" Version="9.0.0-preview.7.24405.4" /> <PackageReference Include="System.Drawing.Common" Version="9.0.0-preview.7.24405.4" />
</ItemGroup> </ItemGroup>