Beispiel #1
0
        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);
        }
Beispiel #2
0
        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);
        }
Beispiel #3
0
        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);
        }
Beispiel #4
0
        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);
            }
        }
Beispiel #5
0
        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);
        }
Beispiel #6
0
        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;
        }
Beispiel #7
0
        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;
            }
        }
Beispiel #8
0
        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);
        }