private PNG formatPng(ImageModel imgMd) { try { FIBITMAP dib = FreeImage.Allocate(imgMd.width, imgMd.height, 32, 8, 8, 8); IntPtr pFibData = FreeImage.GetBits(dib); Marshal.Copy(imgMd.data, 0, pFibData, imgMd.data.Length); //FIMEMORY fm = new FIMEMORY(); FIMEMORY fm = FreeImage.OpenMemory(IntPtr.Zero, 0); FreeImage.SaveToMemory(FREE_IMAGE_FORMAT.FIF_PNG, dib, fm, FREE_IMAGE_SAVE_FLAGS.DEFAULT); FreeImage.SeekMemory(fm, 0, SeekOrigin.End); int bufferSize = FreeImage.TellMemory(fm); //Debug.WriteLine("aaa:" + bufferSize); FreeImage.SeekMemory(fm, 0, SeekOrigin.Begin); byte[] buffer = new byte[bufferSize]; FreeImage.ReadMemory(buffer, (uint)bufferSize, (uint)bufferSize, fm); FreeImage.CloseMemory(fm); FreeImage.Unload(dib); //using(FileStream fs = new FileStream("aaa_" + i + ".png", FileMode.OpenOrCreate, FileAccess.Write, FileShare.Write)) { // fs.Write(buffer, 0, bufferSize); //} //using(FileStream fs = new FileStream("aaa.png", FileMode.OpenOrCreate, FileAccess.Write, FileShare.Write)) { // fs.Write(buffer, 0, bufferSize); //} PNG pngFrame = new PNG(); using (MemoryStream ms = new MemoryStream(buffer)) { pngFrame.Load(ms); } return(pngFrame); } catch (Exception) { } return(null); }
private static string processFile(string path) { BMAP bmap = new BMAP(); string extension = Path.GetExtension(path).Substring(1); string outputName = ""; if (settings.Raw) { if (Raw.IsValid(path)) { Console.WriteLine("Loading : {0}", Path.GetFileName(path)); Raw.Load(path, true); return(path); } } else if (settings.Compress) { WreckfestExtensions we; if (Enum.TryParse <WreckfestExtensions>(extension, out we)) { using (MemoryStream ms = new MemoryStream(File.ReadAllBytes(path))) using (BinaryReader br = new BinaryReader(ms)) { if ( br.ReadInt32() != 4 || br.ReadByte() != extension[3] || br.ReadByte() != extension[2] || br.ReadByte() != extension[1] || br.ReadByte() != extension[0]) { br.BaseStream.Position = 0; var input = br.ReadBytes((int)ms.Length); File.Move(path, path + ".bak"); using (BinaryWriter bw = new BinaryWriter(new FileStream(path, FileMode.Create))) { bw.Write(4); bw.Write(extension[3]); bw.Write(extension[2]); bw.Write(extension[1]); bw.Write(extension[0]); bw.Write((int)we); var hashTable = new int[1 << (14 - 2)]; var output = new byte[LZ4Compress.CalculateChunkSize(input.Length)]; int i = 0; while (i < input.Length) { byte[] chunk = new byte[Math.Min(input.Length - i, output.Length)]; Array.Copy(input, i, chunk, 0, chunk.Length); Array.Clear(hashTable, 0, hashTable.Length); int size = LZ4Compress.Compress(hashTable, chunk, output, chunk.Length, chunk.Length + 4); bw.Write(size); bw.Write(output, 0, size); i += chunk.Length; } } } else { Console.WriteLine("Skipping : {0} is already compressed", Path.GetFileName(path)); } } } else { Console.WriteLine("Error : unsupported extension '{0}'.", extension); } } else if (extension == "bmap") { if (BMAP.IsBMAP(path)) { Console.WriteLine("Loading : {0}", Path.GetFileName(path)); bmap = BMAP.Load(path, false); outputName = string.Format("{0}.{1}.png", Path.GetFileNameWithoutExtension(path), (bmap.Mode == 1 ? "clutter" : (bmap.DDS.Format == D3DFormat.A8R8G8B8 ? "raw" : bmap.DDS.Format.ToString().ToLower()))); Console.WriteLine("Saving : {0}", outputName); if (!Overwrite(string.Format(@"{0}\{1}", Path.GetDirectoryName(path), outputName))) { return(null); } bmap.SaveAsPNG(outputName); return(path); } } else if (extension == "dds") { Console.WriteLine("Loading : {0}", Path.GetFileName(path)); bmap.Path = Path.GetFileName(path); bmap.DDS = DDS.Load(path); Console.WriteLine("Saving : {0}", Path.GetFileName(path.Replace(".dds", ".bmap"))); bmap.Save(path.Replace(".dds", ".x.bmap")); return(path); } else if (Array.IndexOf(new string[] { "png", "tga", "tif" }, extension) > -1) { Texture texture = null; Console.WriteLine("Loading : {0}", Path.GetFileName(path)); switch (extension) { case "png": texture = PNG.Load(path); break; case "tga": texture = TGA.Load(path); break; case "tif": texture = TIF.Load(path); break; } BreckfestSettings original = settings.Clone(); if (Path.GetFileNameWithoutExtension(path).EndsWith(".clutter", StringComparison.OrdinalIgnoreCase)) { settings.Clutter = true; path = path.Replace(".clutter", ""); } else if (Path.GetFileNameWithoutExtension(path).EndsWith(".raw", StringComparison.OrdinalIgnoreCase)) { settings.Format = D3DFormat.A8R8G8B8; path = path.Replace(".raw", ""); } else if (Path.GetFileNameWithoutExtension(path).EndsWith(".dxt1", StringComparison.OrdinalIgnoreCase)) { settings.Format = D3DFormat.DXT1; path = path.Replace(".dxt1", ""); } else if (Path.GetFileNameWithoutExtension(path).EndsWith(".dxt5", StringComparison.OrdinalIgnoreCase)) { settings.Format = D3DFormat.DXT5; path = path.Replace(".dxt5", ""); } bmap.Path = Path.GetFileName(path); if (settings.Clutter) { Console.WriteLine("Cluttering: {0}x{1}", texture.Bitmap.Width, texture.Bitmap.Height); bmap.Mode = 1; bmap.Raw = texture.Bitmap; } else { if (settings.Format == D3DFormat.A8R8G8B8) { Console.WriteLine("Formatting: {0}x{1} (this might take awhile)", texture.Bitmap.Width, texture.Bitmap.Height); } else { Console.WriteLine("Squishing : {0}x{1} (this might take awhile)", texture.Bitmap.Width, texture.Bitmap.Height); } bmap.DDS = new DDS(settings.Format, texture.Bitmap); } Console.WriteLine("Saving : {0}", Path.GetFileName(path.Replace(string.Format(".{0}", extension), ".bmap"))); bmap.Save(path.Replace(string.Format(".{0}", extension), ".x.bmap"), true); settings = original.Clone(); return(path); } return(null); }