Пример #1
0
        public static string GetEncoderVersion()
        {
            uint v        = (uint)NativeMethods.WebPGetEncoderVersion();
            var  revision = v % 256;
            var  minor    = (v >> 8) % 256;
            var  major    = (v >> 16) % 256;

            return(major + "." + minor + "." + revision);
        }
Пример #2
0
        /// <summary>
        /// Encodes the given RGB(A) bitmap to an unmanged memory buffer (returned via result/length). Specify quality = -1 for lossless, otherwise specify a value between 0 and 100.
        /// </summary>
        /// <param name="b"></param>
        /// <param name="quality"></param>
        /// <param name="result"></param>
        /// <param name="length"></param>
        public void Encode(Bitmap b, float quality, out IntPtr result, out long length)
        {
            if (quality < -1)
            {
                quality = -1;
            }
            if (quality > 100)
            {
                quality = 100;
            }
            int w  = b.Width;
            int h  = b.Height;
            var bd = b.LockBits(new Rectangle(0, 0, w, h), System.Drawing.Imaging.ImageLockMode.ReadOnly, b.PixelFormat);

            try {
                result = IntPtr.Zero;

                if (b.PixelFormat == System.Drawing.Imaging.PixelFormat.Format32bppArgb)
                {
                    if (quality == -1)
                    {
                        length = (long)NativeMethods.WebPEncodeLosslessBGRA(bd.Scan0, w, h, bd.Stride, ref result);
                    }
                    else
                    {
                        length = (long)NativeMethods.WebPEncodeBGRA(bd.Scan0, w, h, bd.Stride, quality, ref result);
                    }
                }
                else if (b.PixelFormat == System.Drawing.Imaging.PixelFormat.Format24bppRgb)
                {
                    if (quality == -1)
                    {
                        length = (long)NativeMethods.WebPEncodeLosslessBGR(bd.Scan0, w, h, bd.Stride, ref result);
                    }
                    else
                    {
                        length = (long)NativeMethods.WebPEncodeBGR(bd.Scan0, w, h, bd.Stride, quality, ref result);
                    }
                }
                else
                {
                    using (Bitmap b2 = b.Clone(new Rectangle(0, 0, b.Width, b.Height), System.Drawing.Imaging.PixelFormat.Format32bppArgb))
                    {
                        Encode(b2, quality, out result, out length);
                    }
                }
                if (length == 0)
                {
                    throw new Exception("WebP encode failed!");
                }
            } finally {
                b.UnlockBits(bd);
            }
        }
Пример #3
0
        /// <summary>
        /// Encodes the given RGB(A) bitmap to the given stream. Specify quality = -1 for lossless, otherwise specify a value between 0 and 100.
        /// </summary>
        /// <param name="from"></param>
        /// <param name="to"></param>
        /// <param name="quality"></param>
        public void Encode(Bitmap from, Stream to, float quality)
        {
            IntPtr result;
            long   length;

            Encode(from, quality, out result, out length);
            try {
                byte[] buffer = new byte[4096];
                for (int i = 0; i < length; i += buffer.Length)
                {
                    int used = (int)Math.Min((int)buffer.Length, length - i);
                    Marshal.Copy((IntPtr)((long)result + i), buffer, 0, used);
                    to.Write(buffer, 0, used);
                }
            } finally {
                NativeMethods.WebPSafeFree(result);
            }
        }