StringBuilder ExportALL(InputFormRef.AutoPleaseWait pleaseWait, string basedir, bool isItemFont) { List <Address> list = new List <Address>(); MakeAllDataLengthInner(isItemFont, ref list); PatchUtil.PRIORITY_CODE priorityCode = PatchUtil.SearchPriorityCode(); Color bgcolor = GetFontColor(isItemFont); StringBuilder sb = new StringBuilder(); foreach (Address a in list) { if (a.DataType != FEBuilderGBA.Address.DataTypeEnum.FONT) { continue; } if (a.Addr <= Program.ROM.RomInfo.font_default_end()) {//規定のフォント continue; } int out_width; byte[] fontbyte = ReadFontData(a.Addr, out out_width); Bitmap bitmap = ImageUtil.ByteToImage4(16, 16, fontbyte, 0, bgcolor); ImageUtil.BlackOutUnnecessaryColors(bitmap, 1); string font_filename = Path.Combine(basedir, a.Info + ".png"); U.BitmapSave(bitmap, font_filename); bitmap.Dispose(); sb.AppendLine(a.Info + ".png"); } return(sb); }
private void ExportButton_Click(object sender, EventArgs e) { uint pic_address = (uint)P0.Value; int palette_type = X_PALETTE.SelectedIndex; string filename = ImageFormRef.SaveDialogPngOrGIF(InputFormRef); if (filename == "") { return; } string ext = U.GetFilenameExt(filename); if (ext == ".GIF") { bool r = SaveAnimeGif(filename, pic_address, palette_type); if (!r) { return; } } else { Bitmap bitmap = DrawMoveUnitIcon(pic_address, palette_type); ImageUtil.BlackOutUnnecessaryColors(bitmap, 1); U.BitmapSave(bitmap, filename); } //エクスプローラで選択しよう U.SelectFileByExplorer(filename); }
public static void SaveAPImages(string filename, uint image_addr, uint ap_addr, int x, int y) { image_addr = U.toOffset(image_addr); Bitmap parts = DrawBorderBitmap(image_addr); ap_addr = U.toOffset(ap_addr); ImageUtilAP ap = new ImageUtilAP(); bool r = ap.Parse(ap_addr); if (!r) { return; } Bitmap borderimg = ImageUtil.Blank(256, 160, parts); ap.DrawFrame(borderimg, 0, x, y, parts); string export_filename = ImageFormRef.ExportImage(null, borderimg, filename); string name_filename = MakeBorderNameImageFileName(export_filename); borderimg = ImageUtil.Blank(256, 160, parts); ap.DrawFrame(borderimg, 1, x, y, parts); ImageUtil.BlackOutUnnecessaryColors(borderimg, 1); borderimg.Save(name_filename); }
Bitmap MakeTransparent(Bitmap bitmap) { int palettecount = ImageUtil.GetPalette16Count(bitmap); ImageUtil.BlackOutUnnecessaryColors(bitmap, palettecount); U.MakeTransparent(bitmap); return(bitmap); }
bool SaveAnimeGif(string filename, uint pic_address, int palette_type) { List<ImageUtilAnimeGif.Frame> bitmaps = new List<ImageUtilAnimeGif.Frame>(); for (int showFrame = 0; showFrame < 0xF; showFrame++) { Bitmap bitmap = DrawMoveUnitIcon(pic_address, palette_type, showFrame); ImageUtil.BlackOutUnnecessaryColors(bitmap, 1); uint wait = 10; bitmaps.Add(new ImageUtilAnimeGif.Frame(bitmap, wait)); } //アニメgif生成 ImageUtilAnimeGif.SaveAnimatedGif(filename, bitmaps); return true; }
public static void Export( string filename //書き込むファイル名 , uint anime_address) { string basename = Path.GetFileNameWithoutExtension(filename) + "_"; string basedir = Path.GetDirectoryName(filename); anime_address = U.toOffset(anime_address); if (!U.isSafetyOffset(anime_address)) { return; } string programCode; AnimeType animeType; uint anime_config_address = SkipCode(anime_address, out programCode, out animeType); if (anime_config_address == U.NOT_FOUND) { return; } if (anime_config_address + (4 * 5) > Program.ROM.Data.Length) {//範囲外 return; } //POIN Frames //POIN TSAList //POIN GraphicsList //POIN PalettesList //WORD 0x3d1 //sound id uint frames = Program.ROM.p32(anime_config_address + (4 * 0)); uint tsalist = Program.ROM.p32(anime_config_address + (4 * 1)); uint graphiclist = Program.ROM.p32(anime_config_address + (4 * 2)); uint palettelist = Program.ROM.p32(anime_config_address + (4 * 3)); uint sound_id = Program.ROM.u32(anime_config_address + (4 * 4)); if (!U.isSafetyOffset(frames)) { return; } if (!U.isSafetyOffset(tsalist)) { return; } if (!U.isSafetyOffset(graphiclist)) { return; } if (!U.isSafetyOffset(palettelist)) { return; } //同じアニメを何度も出力しないように記録する. Dictionary <uint, Bitmap> animeHash = new Dictionary <uint, Bitmap>(); List <string> lines = new List <string>(); if (animeType == AnimeType.D) { lines.Add("D #is defender anim"); } if (sound_id > 0) { lines.Add("S" + sound_id.ToString("X04") + " #play sound " + SongTableForm.GetSongName(sound_id)); } //圧縮されていないデータなので、事故防止のため リミッターをかける. uint limitter = frames + 1024 * 1024; //1MBサーチしたらもうあきらめる. limitter = (uint)Math.Min(limitter, Program.ROM.Data.Length); for (uint n = frames; n < limitter; n += 4) { uint id = Program.ROM.u16(n + 0); uint wait = Program.ROM.u16(n + 2); if (id == 0xFFFF) { break; } Bitmap bitmap; string imagefilename = basename.Replace(" ", "_") + "g" + id.ToString("000") + ".png"; if (animeHash.ContainsKey(id)) { bitmap = animeHash[id]; } else { bitmap = DrawFrameImage(n, graphiclist, tsalist, palettelist); int paletteCount = ImageUtil.GetPalette16Count(bitmap); if (paletteCount < 1) { paletteCount = 1; } //利用していないパレットを消す. ImageUtil.BlackOutUnnecessaryColors(bitmap, paletteCount); U.BitmapSave(bitmap, Path.Combine(basedir, imagefilename)); animeHash[id] = bitmap; } string line = wait.ToString() + " " + imagefilename; lines.Add(line); } //まとめて書き込み File.WriteAllLines(filename, lines); }
static string ExportBGFrameImage( uint frame , byte[] frameData , string basedir , string basename , List <uint> animeHash ) { basename = basename + "b_"; //0 frame16 byte1 x86 //4 objImagePointer //8 OAMAbsoStart //12 OAMBGAbsoStart //16 bgImagePointer //20 objPalettePointer //24 bgPalettePointer //CSA_Creater 28 TSA uint bgPointer = U.u32(frameData, frame + 16); uint bgPalettePointer = U.u32(frameData, frame + 24); uint bgTSAPointer = U.u32(frameData, frame + 28); uint imageHash = (bgPointer + bgTSAPointer); string framefilename = ""; int seatnumber = animeHash.IndexOf(imageHash); if (seatnumber >= 0) {//すでに出力しているのでカットする. framefilename = basename + seatnumber.ToString("000") + ".png"; return(framefilename); } byte[] bgPalette = Program.ROM.getBinaryData(U.toOffset(bgPalettePointer), 0x20); byte[] bg_UZ = LZ77.decompress(Program.ROM.Data, U.toOffset(bgPointer)); byte[] bgTSA_UZ = LZ77.decompress(Program.ROM.Data, U.toOffset(bgTSAPointer)); if (bg_UZ.Length <= 0 || bgTSA_UZ.Length <= 0) { Log.Error("bg_UZ", U.ToHexString(bgPointer), "or bgTSA_UZ", U.ToHexString(bgTSAPointer), "is null. broken frame."); return(""); } //まだ出力していない画像なので作成します. seatnumber = animeHash.Count; animeHash.Add(imageHash); //int width = 264; //FEditorAdv //int height = 64; int width = 256 - 8 - 8; int height = ImageUtil.CalcHeightbyTSA(width, bgTSA_UZ.Length); if (height >= 160) { height = 160; } else { height = 64; } Bitmap retImage = ImageUtil.Blank(width, height, bgPalette, 0); Bitmap bg = ImageUtil.ByteToImage16Tile(width, height, bg_UZ, 0, bgPalette, 0, bgTSA_UZ, 0, 0); ImageUtil.BitBlt(retImage, 0, 0, bg.Width, bg.Height, bg, 0, 0); ////パレットマークを右上に描画 CSA_Creator では不要らしい. ////ImageUtil.AppendPaletteMark(retImage); //利用していないパレットを消す. ImageUtil.BlackOutUnnecessaryColors(retImage, 1); framefilename = basename + seatnumber.ToString("000") + ".png"; if (!U.BitmapSave(retImage, Path.Combine(basedir, framefilename))) { return(""); } retImage.Dispose(); return(framefilename); }
void Export(string filename) { string basename = Path.GetFileNameWithoutExtension(filename) + "_"; string basedir = Path.GetDirectoryName(filename); List <string> lines = new List <string>(); if (this.TSAList.Count >= 2 && this.PaletteList.Count == 1) { lines.Add("//" + R._("共通パレットを利用する必要があります。最初の画像のパレットのみが利用され、以後は共通パレットが利用されているものとして処理されます。")); } if (!U.isSafetyOffset(this.FramePointer)) { if (this.TSAList.Count == 1 && this.PaletteList.Count >= 2) { lines.Add("//" + R._("パレットアニメーションである必要があります。最初の画像のみ利用され、以後の画像はパレットだけ利用されます。")); } lines.Add("//" + R._("このアニメーションは、フレーム数が固定されています。最大フレーム数が、{0}({1})である必要があります", U.To0xHexString(this.FramePointer), this.FramePointer)); for (int i = 0; i < this.FramePointer; i++) { Bitmap bitmap; string imagefilename = basename.Replace(" ", "_") + "g" + i.ToString("000") + ".png"; bitmap = DrawDirectLow(i); if (bitmap == null) {//デコードできなかった. bitmap = ImageUtil.Blank(30 * 8, 16 * 8); } //利用していないパレットを消す. ImageUtil.BlackOutUnnecessaryColors(bitmap, 1); U.BitmapSave(bitmap, Path.Combine(basedir, imagefilename)); string line = "1" + " " + imagefilename; lines.Add(line); } } else { //同じアニメを何度も出力しないように記録する. Dictionary <uint, Bitmap> animeHash = new Dictionary <uint, Bitmap>(); uint addr = Program.ROM.p32(FramePointer); //圧縮されていないデータなので、事故防止のため リミッターをかける. uint limitter = addr + 1024 * 1024; //1MBサーチしたらもうあきらめる. limitter = (uint)Math.Min(limitter, Program.ROM.Data.Length); uint id = 0; uint wait = 0; uint i; for (i = 0; addr < limitter; i++, addr += 4) { id = Program.ROM.u16(addr); wait = Program.ROM.u16(addr + 2); if (id == 0xFFFF) { break; } Bitmap bitmap; string imagefilename = basename.Replace(" ", "_") + "g" + id.ToString("000") + ".png"; if (animeHash.ContainsKey(id)) { bitmap = animeHash[id]; } else { bitmap = DrawDirectLow((int)id); if (bitmap == null) {//デコードできなかった. bitmap = ImageUtil.Blank(30 * 8, 16 * 8); } //利用していないパレットを消す. ImageUtil.BlackOutUnnecessaryColors(bitmap, 1); U.BitmapSave(bitmap, Path.Combine(basedir, imagefilename)); animeHash[id] = bitmap; } string line = wait.ToString() + " " + imagefilename; lines.Add(line); } } U.WriteAllLinesInError(filename, lines); }
void ExportGif(string filename) { string basename = Path.GetFileNameWithoutExtension(filename) + "_"; string basedir = Path.GetDirectoryName(filename); List <ImageUtilAnimeGif.Frame> bitmaps = new List <ImageUtilAnimeGif.Frame>(); if (!U.isSafetyOffset(this.FramePointer)) { for (int i = 0; i < this.FramePointer; i++) { Bitmap bitmap; bitmap = DrawDirectLow(i); if (bitmap == null) {//デコードできなかった. bitmap = ImageUtil.Blank(30 * 8, 16 * 8); } //利用していないパレットを消す. ImageUtil.BlackOutUnnecessaryColors(bitmap, 1); bitmaps.Add(new ImageUtilAnimeGif.Frame(bitmap, 1)); } } else { //同じアニメを何度も出力しないように記録する. Dictionary <uint, Bitmap> animeHash = new Dictionary <uint, Bitmap>(); uint addr = Program.ROM.p32(FramePointer); //圧縮されていないデータなので、事故防止のため リミッターをかける. uint limitter = addr + 1024 * 1024; //1MBサーチしたらもうあきらめる. limitter = (uint)Math.Min(limitter, Program.ROM.Data.Length); uint id = 0; uint wait = 0; uint i; for (i = 0; addr < limitter; i++, addr += 4) { id = Program.ROM.u16(addr); wait = Program.ROM.u16(addr + 2); if (id == 0xFFFF) { break; } Bitmap bitmap; string imagefilename = basename.Replace(" ", "_") + "g" + id.ToString("000") + ".png"; if (animeHash.ContainsKey(id)) { bitmap = animeHash[id]; } else { bitmap = DrawDirectLow((int)id); if (bitmap == null) {//デコードできなかった. bitmap = ImageUtil.Blank(30 * 8, 16 * 8); } //利用していないパレットを消す. ImageUtil.BlackOutUnnecessaryColors(bitmap, 1); animeHash[id] = bitmap; } bitmaps.Add(new ImageUtilAnimeGif.Frame(bitmap, wait)); } } //アニメgif生成 ImageUtilAnimeGif.SaveAnimatedGif(filename, bitmaps); }
StringBuilder ExportALL(InputFormRef.AutoPleaseWait pleaseWait, string basedir, bool isItemFont, bool isUserFontOnly, Dictionary <uint, string> codeBMap) { List <Address> list = new List <Address>(); MakeAllDataLengthInner(isItemFont, ref list, codeBMap); PatchUtil.PRIORITY_CODE priorityCode = PatchUtil.SearchPriorityCode(); Color bgcolor = GetFontColor(isItemFont); StringBuilder sb = new StringBuilder(); foreach (Address a in list) { if (a.DataType != FEBuilderGBA.Address.DataTypeEnum.FONTCN) { continue; } if (isUserFontOnly && a.Addr <= Program.ROM.RomInfo.font_default_end) {//規定のフォント continue; } int width; byte[] fontbyte = ReadFontDataZH(a.Addr, out width); if (width == 0) { continue; } string ch = GetFontCharFromExportName(a.Info); if (ch == "") { continue; } uint hex = U.ConvertMojiCharToUnitFast(ch, priorityCode); string type = (isItemFont ? "item" : "text"); Bitmap bitmap; if (isItemFont) { bitmap = ImageUtil.ByteToImage4ZH(width + 1, 0xD, fontbyte, 0, bgcolor); bitmap = ConvertVanillaFontSizeBitmap(bitmap, 2); } else { bitmap = ImageUtil.ByteToImage4ZH(width, 0xD, fontbyte, 0, bgcolor); bitmap = ConvertVanillaFontSizeBitmap(bitmap, 1); } ImageUtil.BlackOutUnnecessaryColors(bitmap, 1); string name = U.escape_filename(a.Info) + "_" + U.ToHexString(hex); string font_filename = Path.Combine(basedir, name + ".png"); try { U.BitmapSave(bitmap, font_filename); } catch (Exception) {//このOSではこの文字のファイル名は使えないので削ります string trimName = U.substr(a.Info, 0, a.Info.Length - 2); name = trimName + "_" + U.ToHexString(hex); font_filename = Path.Combine(basedir, name + ".png"); U.BitmapSave(bitmap, font_filename); } bitmap.Dispose(); sb.Append(ch); sb.Append("\t"); sb.Append(type); sb.Append("\t"); sb.Append(width); sb.Append("\t"); sb.AppendLine(Path.GetFileName(font_filename)); } return(sb); }
public static void Export( string filename //書き込むファイル名 , uint anime_address , string name) { string basename = Path.GetFileNameWithoutExtension(filename) + "_"; string basedir = Path.GetDirectoryName(filename); anime_address = U.toOffset(anime_address); if (!U.isSafetyOffset(anime_address)) { return; } List <string> lines = new List <string>(); if (name != "") { lines.Add("//NAME=" + name); } //同じアニメを何度も出力しないように記録する. Dictionary <uint, Bitmap> animeHash = new Dictionary <uint, Bitmap>(); //圧縮されていないデータなので、事故防止のため リミッターをかける. uint limitter = anime_address + 1024 * 1024; //1MBサーチしたらもうあきらめる. limitter = (uint)Math.Min(limitter, Program.ROM.Data.Length); uint id = 0; //IDの概念がないので、0から適当に振ります for (uint n = anime_address; n < limitter; n += 12) { uint wait = Program.ROM.u8(n + 0); uint term1 = Program.ROM.u32(n); uint imgOffset = Program.ROM.p32(n + 4); uint palOffset = Program.ROM.p32(n + 8); if (term1 == 0 && imgOffset == 0) { break; } uint hash = imgOffset + palOffset; string imagefilename; Bitmap bitmap; if (animeHash.ContainsKey(hash)) { bitmap = animeHash[hash]; imagefilename = MakeFilename(basename, bitmap); } else { string log; bitmap = DrawFrameImage(n, out log); bitmap.Tag = id; id++; int paletteCount = ImageUtil.GetPalette16Count(bitmap); if (paletteCount < 1) { paletteCount = 1; } //利用していないパレットを消す. ImageUtil.BlackOutUnnecessaryColors(bitmap, paletteCount); imagefilename = MakeFilename(basename, bitmap); U.BitmapSave(bitmap, Path.Combine(basedir, imagefilename)); animeHash[hash] = bitmap; } string line = wait.ToString() + "\t" + imagefilename; uint sound = Program.ROM.u16(n + 2); if (sound != 0) { line += "\t" + U.To0xHexString(sound); } lines.Add(line); } //まとめて書き込み File.WriteAllLines(filename, lines); }