Skip to content

Commit 9e7ad60

Browse files
committed
不能让数据定义耦合具体实现逻辑
1 parent aa9fed4 commit 9e7ad60

7 files changed

Lines changed: 94 additions & 41 deletions

File tree

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,8 @@
1-
using SixLabors.ImageSharp;
2-
using SixLabors.ImageSharp.PixelFormats;
3-
4-
using System.Text.Json.Serialization;
1+
using System.Text.Json.Serialization;
52

63
namespace DotNetCampus.MediaConverters.Contexts;
74

85
[JsonDerivedType(typeof(ReplaceColorTask))]
96
public interface IImageConvertTask
107
{
11-
void Run(Image<Rgba32> image);
128
}
Lines changed: 1 addition & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,6 @@
1-
using DotNetCampus.MediaConverters.Imaging.Effects;
2-
using DotNetCampus.MediaConverters.Imaging.Effects.Colors;
3-
using DotNetCampus.MediaConverters.Utils;
4-
5-
using SixLabors.ImageSharp;
6-
using SixLabors.ImageSharp.PixelFormats;
7-
8-
namespace DotNetCampus.MediaConverters.Contexts;
1+
namespace DotNetCampus.MediaConverters.Contexts;
92

103
public class ReplaceColorTask : IImageConvertTask
114
{
125
public List<ReplaceColorInfo>? ReplaceColorInfoList { get; init; }
13-
14-
public void Run(Image<Rgba32> image)
15-
{
16-
if (ReplaceColorInfoList is null || ReplaceColorInfoList.Count == 0)
17-
{
18-
return;
19-
}
20-
21-
var dictionary = new List<(ColorMetadata SourceColor, ColorMetadata TargetColor)>(ReplaceColorInfoList.Count);
22-
foreach (var replaceColorInfo in ReplaceColorInfoList)
23-
{
24-
var (oldColor, newColor) = replaceColorInfo.ToRgba32Pair();
25-
var oldMetadata = new ColorMetadata(oldColor);
26-
var newMetadata = new ColorMetadata(newColor);
27-
dictionary.Add((oldMetadata, newMetadata));
28-
}
29-
30-
image.ReplaceColor(dictionary);
31-
}
326
}

src/MediaConverters/MediaConverters.Tool/Program.cs

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
// See https://aka.ms/new-console-template for more information
22

3-
using System.Diagnostics;
4-
using System.Text.Json;
5-
63
using DotNetCampus.MediaConverters.Contexts;
74
using DotNetCampus.MediaConverters.Imaging.Optimizations;
5+
using DotNetCampus.MediaConverters.Workers;
86

97
using SixLabors.ImageSharp;
108
using SixLabors.ImageSharp.PixelFormats;
9+
10+
using System.Diagnostics;
11+
using System.Text.Json;
12+
1113
using SourceGenerationContext = DotNetCampus.MediaConverters.Contexts.SourceGenerationContext;
1214

1315
namespace DotNetCampus.MediaConverters;
@@ -44,16 +46,12 @@ public static async Task<int> Main(string[] args)
4446
break;
4547
case ImageFileOptimizationFailureReason.UnknownImageFormat:
4648
return ErrorCode.UnknownImageFormat;
47-
break;
4849
case ImageFileOptimizationFailureReason.InvalidImageContent:
4950
return ErrorCode.InvalidImageContent;
50-
break;
5151
case ImageFileOptimizationFailureReason.FileNotFound:
5252
return ErrorCode.ImageFileNotFound;
53-
break;
5453
case ImageFileOptimizationFailureReason.NotSupported:
5554
return ErrorCode.NotSupported;
56-
break;
5755
default:
5856
throw new ArgumentOutOfRangeException();
5957
}
@@ -66,10 +64,11 @@ public static async Task<int> Main(string[] args)
6664
if (imageConvertContext.ImageConvertTaskList is { } list)
6765
{
6866
using var image = await Image.LoadAsync<Rgba32>(optimizedImageFile.FullName);
67+
var workerProvider = new WorkerProvider();
6968

70-
foreach (var imageConvertTask in list)
69+
foreach (IImageConvertTask imageConvertTask in list)
7170
{
72-
imageConvertTask.Run(image);
71+
workerProvider.Run(image, imageConvertTask);
7372
}
7473
}
7574

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
using DotNetCampus.MediaConverters.Contexts;
2+
using SixLabors.ImageSharp;
3+
using SixLabors.ImageSharp.PixelFormats;
4+
5+
namespace DotNetCampus.MediaConverters.Workers;
6+
7+
interface IWorker
8+
{
9+
Type TaskType { get; }
10+
void Run(Image<Rgba32> image, IImageConvertTask task);
11+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
using DotNetCampus.MediaConverters.Contexts;
2+
using DotNetCampus.MediaConverters.Imaging.Effects;
3+
using DotNetCampus.MediaConverters.Imaging.Effects.Colors;
4+
using DotNetCampus.MediaConverters.Utils;
5+
6+
using SixLabors.ImageSharp;
7+
using SixLabors.ImageSharp.PixelFormats;
8+
9+
namespace DotNetCampus.MediaConverters.Workers;
10+
11+
internal class ReplaceColorWorker : WorkerBase<ReplaceColorTask>
12+
{
13+
protected override void RunCore(Image<Rgba32> image, ReplaceColorTask task)
14+
{
15+
if (task.ReplaceColorInfoList is null || task.ReplaceColorInfoList.Count == 0)
16+
{
17+
return;
18+
}
19+
20+
var dictionary = new List<(ColorMetadata SourceColor, ColorMetadata TargetColor)>(task.ReplaceColorInfoList.Count);
21+
foreach (var replaceColorInfo in task.ReplaceColorInfoList)
22+
{
23+
var (oldColor, newColor) = replaceColorInfo.ToRgba32Pair();
24+
var oldMetadata = new ColorMetadata(oldColor);
25+
var newMetadata = new ColorMetadata(newColor);
26+
dictionary.Add((oldMetadata, newMetadata));
27+
}
28+
29+
image.ReplaceColor(dictionary);
30+
}
31+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
using DotNetCampus.MediaConverters.Contexts;
2+
using SixLabors.ImageSharp;
3+
using SixLabors.ImageSharp.PixelFormats;
4+
5+
namespace DotNetCampus.MediaConverters.Workers;
6+
7+
abstract class WorkerBase<T> : IWorker
8+
where T : IImageConvertTask
9+
{
10+
public void Run(Image<Rgba32> image, IImageConvertTask task)
11+
{
12+
RunCore(image, (T) task);
13+
}
14+
15+
protected abstract void RunCore(Image<Rgba32> image, T task);
16+
public Type TaskType => typeof(T);
17+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
using DotNetCampus.MediaConverters.Contexts;
2+
using SixLabors.ImageSharp;
3+
using SixLabors.ImageSharp.PixelFormats;
4+
5+
namespace DotNetCampus.MediaConverters.Workers;
6+
7+
class WorkerProvider
8+
{
9+
private readonly IReadOnlyList<IWorker> _workerList =
10+
[
11+
new ReplaceColorWorker(),
12+
];
13+
14+
public void Run(Image<Rgba32> image, IImageConvertTask task)
15+
{
16+
var taskType = task.GetType();
17+
foreach (var worker in _workerList)
18+
{
19+
if (worker.TaskType == taskType)
20+
{
21+
worker.Run(image, task);
22+
}
23+
}
24+
}
25+
}

0 commit comments

Comments
 (0)