/// <summary> /// Convert a PSB to External Texture PSB. /// </summary> /// <param name="inputPath"></param> /// <param name="outputUnlinkedPsb">output unlinked PSB if you need</param> /// <param name="order"></param> /// <param name="format"></param> public static void UnlinkToFile(string inputPath, bool outputUnlinkedPsb = true, PsbLinkOrderBy order = PsbLinkOrderBy.Name, PsbImageFormat format = PsbImageFormat.Png) { if (!File.Exists(inputPath)) { return; } var name = Path.GetFileNameWithoutExtension(inputPath); var dirPath = Path.Combine(Path.GetDirectoryName(inputPath), name); if (File.Exists(dirPath)) { name += "-resources"; dirPath += "-resources"; } if (!Directory.Exists(dirPath)) //ensure there is no file with same name! { Directory.CreateDirectory(dirPath); } var psb = new PSB(inputPath); var texs = psb.Unlink(); if (outputUnlinkedPsb) { psb.Merge(); var psbSavePath = Path.ChangeExtension(inputPath, ".unlinked.psb"); File.WriteAllBytes(psbSavePath, psb.Build()); } var texExt = format == PsbImageFormat.Bmp ? ".bmp" :".png"; var texFormat = format == PsbImageFormat.Bmp ? ImageFormat.Bmp : ImageFormat.Png; switch (order) { case PsbLinkOrderBy.Convention: foreach (var tex in texs) { tex.Save(Path.Combine(dirPath, tex.Tag + texExt), texFormat); } break; case PsbLinkOrderBy.Name: foreach (var tex in texs) { tex.Save(Path.Combine(dirPath, $"{name}_{tex.Tag}{texExt}"), texFormat); } break; case PsbLinkOrderBy.Order: for (var i = 0; i < texs.Count; i++) { var tex = texs[i]; tex.Save(Path.Combine(dirPath, $"{i}{texExt}"), texFormat); } break; } }