コード例 #1
0
ファイル: ImageCompressor.cs プロジェクト: xiangzhi/psi
        /// <inheritdoc/>
        public void Serialize(BufferWriter writer, Image instance, SerializationContext context)
        {
            // Note: encoder instances are created here because they may have thread affinity.
            IBitmapEncoder encoder = null;

            switch (this.CompressionMethod)
            {
            case CompressionMethod.JPEG:
                encoder = new JpegBitmapEncoder {
                    QualityLevel = 90
                };
                break;

            case CompressionMethod.PNG:
                encoder = new PngBitmapEncoder();
                break;

            case CompressionMethod.None:
                break;
            }

            if (encoder != null)
            {
                using (var sharedEncodedImage = EncodedImagePool.GetOrCreate())
                {
                    sharedEncodedImage.Resource.EncodeFrom(instance, encoder.Encode);
                    Serializer.Serialize(writer, sharedEncodedImage, context);
                }
            }
            else
            {
                Serializer.Serialize(writer, instance, context);
            }
        }
コード例 #2
0
 /// <summary>
 /// Compresses an image using the specified encoder
 /// </summary>
 /// <param name="image">Image to compress</param>
 /// <param name="encoder">Encoder to use to compress</param>
 public void EncodeFrom(Image image, IBitmapEncoder encoder)
 {
     this.stream.Position = 0;
     encoder.Encode(image, this.stream);
     this.stream.Flush();
     this.Width           = image.Width;
     this.Height          = image.Height;
     this.CountBytes      = (int)this.stream.Position;
     this.stream.Position = 0;
 }
コード例 #3
0
        public _MJpegAviEncoder(int width, int height, IBitmapEncoder encoder)
        {
            // Argument.IsPositive(width, nameof(width));
            // Argument.IsPositive(height, nameof(height));
            // Argument.IsInRange(quality, 1, 100, nameof(quality));

            this.width  = width;
            this.height = height;
            jpegEncoder = encoder;

            buffer = new MemoryStream(MaxEncodedSize);
        }
コード例 #4
0
        /// <summary>
        /// Given an image and stream, this method will compress the image using
        /// the compression method set in Initialize()
        /// </summary>
        /// <param name="writer">Stream to write compressed image to</param>
        /// <param name="instance">Image to be compressed</param>
        /// <param name="context">Serialization context</param>
        public void Serialize(BufferWriter writer, Image instance, SerializationContext context)
        {
            IBitmapEncoder encoder = null;

            switch (this.compressionMethod)
            {
            case Image.CustomSerializer.CompressionMethod.JPEG:
                encoder = new JpegBitmapEncoder {
                    QualityLevel = 90
                };
                break;

            case Image.CustomSerializer.CompressionMethod.PNG:
                encoder = new PngBitmapEncoder();
                break;
            }

            using (var sharedEncodedImage = EncodedImagePool.GetOrCreate())
            {
                sharedEncodedImage.Resource.EncodeFrom(instance, encoder);
                Serializer.Serialize(writer, sharedEncodedImage, context);
            }
        }
コード例 #5
0
 public static IBitmapEncoder CreateRef(this IBitmapEncoder objectRef) =>
 ((IBitmapEncoder)objectRef.CreateRef(typeof(IBitmapEncoder)));
コード例 #6
0
        public static MJpegAviFrameWriter AddVideoFrameWriter(AviWriter aviWriter, int width, int height, IBitmapEncoder encoder)
        {
            // Argument.IsNotNull(writer, nameof(writer));
            // Argument.IsPositive(width, nameof(width));
            // Argument.IsPositive(height, nameof(height));
            // Argument.IsInRange(quality, 1, 100, nameof(quality));

            var mjpegEncoder = new _MJpegAviEncoder(width, height, encoder);
            var videoStream  = aviWriter.AddEncodingVideoStream(mjpegEncoder, true, width, height);

            return(new MJpegAviFrameWriter(videoStream));
        }
コード例 #7
0
        public static void SaveToAVI(string filePath, IEnumerable <MemoryBitmap> frames, decimal fps, IBitmapEncoder jpgEncoder)
        {
            MJpegAviFrameWriter writer = null;

            System.Drawing.Size frameSize = System.Drawing.Size.Empty;

            using (var avi = new AviWriter(filePath))
            {
                avi.FramesPerSecond = fps;

                foreach (var frame in frames)
                {
                    if (frameSize.IsEmpty)
                    {
                        frameSize = frame.Size;
                    }
                    else if (frame.Size != frameSize)
                    {
                        throw new ArgumentException("all frames must have the same size.", nameof(frames));
                    }

                    if (writer == null)
                    {
                        writer = AddVideoFrameWriter(avi, frame.Width, frame.Height, jpgEncoder);
                    }
                    writer.WriteFrame(frame);
                }
            }
        }