Skip to content

Commit 4f97b37

Browse files
committed
feat: implement asynchronous image creation and layer processing in PSD utilities and view models
1 parent 50911dc commit 4f97b37

File tree

4 files changed

+26
-15
lines changed

4 files changed

+26
-15
lines changed

KuchiPaku.Psd/PsdUtil.cs

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using System.Drawing.Imaging;
77
using static PsdParser.AdditionalLayerInformations.SectionDividerSetting;
88
using System.Runtime.InteropServices;
9+
using System.Threading.Tasks;
910

1011
namespace KuchiPaku.Psd;
1112

@@ -57,7 +58,7 @@ public static IReadOnlyList<YmmPsdLayer> ParsePsdLayers(PsdFile psd)
5758
return tree;
5859
}
5960

60-
public static Bitmap CreateImageFromTree(
61+
public static async Task<Bitmap> CreateImageFromTreeAsync(
6162
IReadOnlyList<YmmPsdLayer> tree, int width, int height,
6263
IEnumerable<string>? enabledLayers
6364
)
@@ -71,15 +72,22 @@ public static Bitmap CreateImageFromTree(
7172
g.Clear(System.Drawing.Color.Transparent);
7273

7374
// 入れ子になったレイヤーを走査して合成
74-
CombineLayerRecursive(tree, g, enabledLayers);
75+
await CombineLayerRecursiveAsync(tree, g, enabledLayers)
76+
.ConfigureAwait(false);
7577
}
7678

7779
return finalBitmap;
7880
}
7981

8082
public static async Task<Bitmap> CreateImageFromLayerAsync(YmmPsdLayer layer)
8183
{
82-
///*
84+
var pixelData = await ReadImageAsync(layer).ConfigureAwait(false);
85+
return CreateBitmapFromPixelData(
86+
pixelData, layer.Image.Width, layer.Image.Height);
87+
}
88+
89+
static async Task<byte[]> ReadImageAsync(YmmPsdLayer layer)
90+
{
8391
await _lock.WaitAsync().ConfigureAwait(false);
8492
byte[] pixelData = [];
8593
try
@@ -91,13 +99,11 @@ public static async Task<Bitmap> CreateImageFromLayerAsync(YmmPsdLayer layer)
9199
{
92100
_lock.Release();
93101
}
94-
//*/
95-
//var pixelData = layer.Image.Read();
96-
return CreateBitmapFromPixelData(
97-
pixelData, layer.Image.Width, layer.Image.Height);
102+
103+
return pixelData;
98104
}
99105

100-
static void CombineLayerRecursive(
106+
static async ValueTask CombineLayerRecursiveAsync(
101107
IEnumerable<YmmPsdLayer> layers,
102108
Graphics g,
103109
IEnumerable<string>? enabledLayers
@@ -112,7 +118,8 @@ static void CombineLayerRecursive(
112118
{
113119
continue;
114120
}
115-
CombineLayerRecursive(layer.Children.Reverse(), g, enabledLayers);
121+
await CombineLayerRecursiveAsync(layer.Children.Reverse(), g, enabledLayers)
122+
.ConfigureAwait(false);
116123
}
117124
else if (layer.IsNormalLayer)
118125
{
@@ -127,7 +134,8 @@ static void CombineLayerRecursive(
127134
}
128135

129136
// 通常レイヤーの場合、ビットマップを取得して合成
130-
byte[] pixelData = layer.Image.Read(); // Pixelデータ取得
137+
var pixelData = await ReadImageAsync(layer)
138+
.ConfigureAwait(false); // Pixelデータ取得
131139
using var layerBitmap = CreateBitmapFromPixelData(
132140
pixelData,
133141
layer.Image.Width,

KuchiPaku/ViewModels/LipSyncLayerViewModel.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,16 +62,17 @@ Dictionary<string, bool> defaultVisible
6262
if (ImageSrc is not null) return;
6363
var w = PsdRect.Width;
6464
var h = PsdRect.Height;
65-
ShowThumb(VisibleLayerList.Where(v => v.Value).Select(v=>v.Key));
65+
await ShowThumbAsync(VisibleLayerList.Where(v => v.Value).Select(v=>v.Key));
6666
//ShowLayer();
6767
});
6868
}
6969

70-
public void ShowThumb(
70+
public async Task ShowThumbAsync(
7171
IEnumerable<string> enabledLayers
7272
)
7373
{
74-
using var bmp = PsdUtil.CreateImageFromTree(LayerTree, PsdWidth, PsdHeight, enabledLayers);
74+
using var bmp = await PsdUtil
75+
.CreateImageFromTreeAsync(LayerTree, PsdWidth, PsdHeight, enabledLayers);
7576
var rate = 200.0 / Math.Max(bmp.Width, bmp.Height);
7677
var rw = (int)(bmp.Width * rate);
7778
var rh = (int)(bmp.Height * rate);

KuchiPaku/ViewModels/MainWindowViewModel.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -433,6 +433,8 @@ private async ValueTask SelectedCharaItemChangedAsync(CharacterListViewModel ite
433433
//psd版LipSyncImagesのリスト構築
434434
var flowControl = await LoadLipSyncLayersAsync(chara);
435435

436+
Manager.Info("PSD解析終了", "PSDファイルの解析終了!", true);
437+
//await Task.Delay(1000);
436438
Manager.Dismiss(loading);
437439
if (!flowControl) return;
438440

@@ -553,7 +555,7 @@ async ValueTask<bool>
553555
var psd = await PsdUtil.LoadPsdAsync(path);
554556
var tree = PsdUtil.ParsePsdLayers(psd);
555557

556-
//TODO: デフォルトレイヤー表示をymmpの"TachieDefaultItemParameter"から取得して反映、なければPSDファイルそのまま
558+
//デフォルトレイヤー表示をymmpの"TachieDefaultItemParameter"から取得して反映、なければPSDファイルそのまま
557559
var defs = SelectedCharaItem?.EnableLayers;
558560
if (defs is not null && defs!.Any())
559561
{

KuchiPaku/ViewModels/SelectedLayerViewModel.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ private ValueTask IsVisibleChangedAsync(bool value)
148148
var list = MainVM.SelectedLayers?.VisibleLayerList
149149
.Where(x => x.Value)
150150
.Select(x => x.Key) ?? [];
151-
MainVM?.SelectedLayers?.ShowThumb(list);
151+
MainVM?.SelectedLayers?.ShowThumbAsync(list);
152152

153153
return default;
154154
}

0 commit comments

Comments
 (0)