public static void SaveImage(Stream stream, FreeImageBitmap bitmap) { AjpHeader ajpHeaderFromBitmap = bitmap.Tag as AjpHeader; AjpHeader ajpHeaderFromComment = null; if (!string.IsNullOrEmpty(bitmap.Comment)) { ajpHeaderFromComment = new AjpHeader(); if (!ajpHeaderFromComment.ParseComment(bitmap.Comment)) { ajpHeaderFromComment = null; } } var ms = new MemoryStream(); var ms2 = new MemoryStream(); bitmap.Save(ms, FREE_IMAGE_FORMAT.FIF_JPEG, FREE_IMAGE_SAVE_FLAGS.JPEG_PROGRESSIVE | FREE_IMAGE_SAVE_FLAGS.JPEG_QUALITYGOOD); using (var alpha = bitmap.GetChannel(FREE_IMAGE_COLOR_CHANNEL.FICC_ALPHA)) { if (alpha != null) { alpha.Comment = "signature = 19792, version = 2, headerSize = 64, colorDepth = 8"; Pms.SaveImage(ms2, alpha); } } AjpHeader ajpHeader = ajpHeaderFromBitmap; if (ajpHeader == null) { ajpHeader = ajpHeaderFromComment; } SaveImage(stream, ms.ToArray(), ms2.ToArray(), ajpHeader); }
private static void WriteAjpHeader(Stream stream, AjpHeader ajp) { var bw = new BinaryWriter(stream); bw.Write(ajp.signature); bw.Write(ajp.version); bw.Write(ajp.headerSize1); bw.Write(ajp.width); bw.Write(ajp.height); bw.Write(ajp.imageLocation); bw.Write(ajp.jpegDataLength); bw.Write(ajp.alphaLocation); bw.Write(ajp.alphaDataLength); if (ajp.version > 0) { bw.Write(ajp.alphaUnpacked); } bw.Write(ajp.unknown1); bw.Write(ajp.unknown2); bw.Write(ajp.unknown3); }
public static AjpHeader ReadAjpHeader(BinaryReader br) { var ajp = new AjpHeader(); try { ajp.signature = br.ReadInt32(); ajp.version = br.ReadInt32(); if (ajp.version < 0) { return(null); } ajp.headerSize1 = br.ReadInt32(); ajp.width = br.ReadInt32(); ajp.height = br.ReadInt32(); ajp.imageLocation = br.ReadInt32(); ajp.jpegDataLength = br.ReadInt32(); ajp.alphaLocation = br.ReadInt32(); ajp.alphaDataLength = br.ReadInt32(); if (ajp.version > 0) { ajp.alphaUnpacked = br.ReadInt32(); ajp.unknown1 = br.ReadBytes(12); } else { ajp.unknown1 = br.ReadBytes(16); } ajp.unknown2 = br.ReadInt32(); ajp.unknown3 = br.ReadBytes(16); } catch (IOException) { return(null); } return(ajp); }
private static void SaveImage(Stream deststream, byte[] jpegFile, byte[] pmsFile, AjpHeader ajpHeader) { if (ajpHeader == null) { ajpHeader = new AjpHeader(); } if (ajpHeader.signature == 0) { ajpHeader.signature = 0x00504a41; } if (ajpHeader.headerSize1 == 0) { ajpHeader.headerSize1 = 0x38; } if (ajpHeader.imageLocation == 0) { ajpHeader.imageLocation = 0x38; } if (ajpHeader.alphaUnpacked == 0) { //ajpHeader.alphaUnpacked = 0; } if (ajpHeader.unknown1 == null || ajpHeader.unknown1.Length == 0) { if (ajpHeader.version > 0) { ajpHeader.unknown1 = GetBytes("037BC601E1FF1AA7FB7AC601"); } else { ajpHeader.unknown1 = GetBytes("1FDBC2B6037BC601E1FF1AA7FB7AC601"); } } if (ajpHeader.unknown3 == null || ajpHeader.unknown3.Length == 0) { ajpHeader.unknown3 = GetBytes("A24951674A460B8BCAAA4C93B7CA167C"); } if (ajpHeader.width == 0 && ajpHeader.height == 0) { int width, height; if (GetJpegSize(jpegFile, out width, out height)) { ajpHeader.width = width; ajpHeader.height = height; } else { var ms = new MemoryStream(jpegFile); using (FreeImageBitmap jpegImage = new FreeImageBitmap(ms, FREE_IMAGE_FORMAT.FIF_JPEG)) { ajpHeader.width = jpegImage.Width; ajpHeader.height = jpegImage.Height; } } } ajpHeader.jpegDataLength = jpegFile.Length; bool hasAlpha = pmsFile != null && pmsFile.Length > 0; ZLibStream pmsFileCompressed = null; if (!hasAlpha) { ajpHeader.alphaLocation = 0; ajpHeader.alphaDataLength = 0; } else { using (var pmsStream = new MemoryStream(pmsFile)) { pmsFileCompressed = new ZLibStream(pmsStream, CompressionMode.Compress); if (ajpHeader.alphaUnpacked == 0) { ajpHeader.alphaDataLength = pmsFile.Length; } else { ajpHeader.alphaDataLength = (int)pmsFileCompressed.Length; } } ajpHeader.alphaLocation = ajpHeader.jpegDataLength + ajpHeader.headerSize1; } WriteAjpHeader(deststream, ajpHeader); var ajpPos = deststream.Position; using (var bw = new BinaryWriter(deststream)) { bw.Write(jpegFile); var pmsPos = deststream.Position; if (pmsFile != null && pmsFile.Length > 16) { if (ajpHeader.alphaUnpacked == 0) { bw.Write(pmsFile); } else { using (var br = new BinaryReader(pmsFileCompressed)) pmsFile = br.ReadBytes((int)pmsFileCompressed.Length); pmsFileCompressed.Dispose(); } } ScrambleStream(deststream, jpegFile.Length, ajpPos); ScrambleStream(deststream, pmsFile.Length, pmsPos); } }
public static void SaveImage(Stream stream, byte[] jpegFile, FreeImageBitmap alpha, AjpHeader ajpHeader) { byte[] pmsFile = null; if (alpha != null) { using (var ms = new MemoryStream()) { alpha.Comment = "signature = 19792, version = 2, headerSize = 64"; Pms.SaveImage(ms, alpha); pmsFile = ms.ToArray(); } } SaveImage(stream, jpegFile, pmsFile, ajpHeader); }
private static void LoadImage(Stream ajpStream, out MemoryStream jpegFile, out MemoryStream pmsFile, out AjpHeader ajpHeader) { jpegFile = null; pmsFile = null; var brAjp = new BinaryReader(ajpStream); ajpHeader = ReadAjpHeader(brAjp); if (ajpHeader == null) { return; } jpegFile = new MemoryStream(ajpHeader.jpegDataLength); ajpStream.Position = ajpHeader.imageLocation; jpegFile.WriteFromStream(ajpStream, ajpHeader.jpegDataLength); ScrambleStream(jpegFile, ajpHeader.jpegDataLength); var br1 = new BinaryReader(jpegFile); var b = br1.ReadBytes((int)jpegFile.Length); HexDump.HexView.Debugger(b.Slice(0, 30)); int pmsSize = ajpHeader.alphaDataLength; if (pmsSize <= 0) { return; } ajpStream.Position = ajpHeader.alphaLocation; if (ajpHeader.alphaUnpacked != 0) { pmsFile = new MemoryStream(ajpHeader.alphaUnpacked); using (var packed = new MemoryStream(ajpHeader.alphaUnpacked)) { packed.WriteFromStream(ajpStream, pmsSize); packed.Position = 0; ScrambleStream(packed, pmsSize); using (var mask = new ZLibStream(packed, CompressionMode.Decompress)) using (var br = new BinaryReader(mask)) { var bytes = br.ReadBytes(ajpHeader.alphaUnpacked); pmsFile.Write(bytes, 0, bytes.Length); } } } else { pmsFile = new MemoryStream(pmsSize); pmsFile.WriteFromStream(ajpStream, pmsSize); ScrambleStream(pmsFile, ajpHeader.alphaDataLength); } pmsFile.Position = 0; return; }
public static void LoadImage(Stream ajpStream, out byte[] jpegBytes, out FreeImageBitmap alpha, out AjpHeader ajpHeader) { MemoryStream jpegFile; MemoryStream pmsFile; LoadImage(ajpStream, out jpegFile, out pmsFile, out ajpHeader); jpegBytes = jpegFile.ToArray(); jpegFile.Dispose(); alpha = null; if (pmsFile != null) { FreeImageBitmap pmsImage = Pms.LoadImage(pmsFile.ToArray()); pmsFile.Dispose(); alpha = pmsImage; } }
public static void LoadImage(byte[] bytes, out byte[] jpegBytes, out FreeImageBitmap alpha, out AjpHeader ajpHeader) { var ms = new MemoryStream(bytes); LoadImage(ms, out jpegBytes, out alpha, out ajpHeader); }