Newer
Older
ClosedXML / ClosedXML / Excel / Drawings / XLPicture.cs
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using DocumentFormat.OpenXml.Packaging;

namespace ClosedXML.Excel.Drawings
{
    public class XLPicture : IXLPicture
    {
        private MemoryStream imgStream;
        private List<IXLMarker> Markers;
        private String name;
        private bool isAbsolute;
        private ImagePartType type = ImagePartType.Jpeg;

        private long iMaxWidth = 500;
        private long iMaxHeight = 500;

        private long iWidth;
        private long iHeight;

        private long iOffsetX;
        private long iOffsetY;

        private float iVerticalResolution;
        private float iHorizontalResolution;

        private bool isResized = false;

        private void Resize()
        {
            if (iWidth > iMaxHeight || iHeight > iMaxWidth)
            {
                var scaleX = (double)iWidth / (double)iMaxWidth;
                var scaleY = (double)iHeight / (double)iMaxHeight;
                var scale = Math.Max(scaleX, scaleY);
                iWidth = (int)((double)iWidth / scale);
                iHeight = (int)((double)iHeight / scale);
            }
            isResized = true;
        }

        public long MaxWidth
        {
            get
            {
                return ConvertToEmu(iMaxWidth, iHorizontalResolution);
            }
            set
            {
                iMaxWidth = value;
                isResized = false;
            }
        }


        public long MaxHeight
        {
            get
            {
                return ConvertToEmu(iMaxHeight, iVerticalResolution);
            }
            set
            {
                iMaxHeight = value;
                isResized = false;
            }
        }

        public long Width
        {
            get
            {
                if (!isResized)
                {
                    Resize();
                }
                return ConvertToEmu(iWidth, iHorizontalResolution);
            }
            set { }
        }

        public long Height
        {
            get
            {
                if (!isResized)
                {
                    Resize();
                }
                return ConvertToEmu(iHeight, iVerticalResolution);
            }
            set { }
        }

        public long RawHeight
        {
            get { return (long)iHeight; }
        }
        public long RawWidth
        {
            get { return (long)iWidth; }
        }

        public long OffsetX
        {
            get { return ConvertToEmu(iOffsetX, iHorizontalResolution); }
            set { iOffsetX = value; }
        }
        public long OffsetY
        {
            get { return ConvertToEmu(iOffsetY, iVerticalResolution); }
            set { iOffsetY = value; }
        }

        public long RawOffsetX
        {
            get
            {
                return iOffsetX;
            }
            set
            {
                iOffsetX = value;
            }
        }

        public long RawOffsetY
        {
            get
            {
                return iOffsetY;
            }
            set
            {
                iOffsetY = value;
            }
        }

        private long ConvertToEmu(long pixels, float resolution)
        {
            return (long)(914400 * pixels / resolution);
        }

        public Stream ImageStream
        {
            get
            {
                return imgStream;
            }
            set
            {
                if (imgStream == null)
                {
                    imgStream = new MemoryStream();
                }
                else
                {
                    imgStream.Dispose();
                    imgStream = new MemoryStream();
                }
                value.CopyTo(imgStream);
                imgStream.Seek(0, SeekOrigin.Begin);

                using (var bitmap = new System.Drawing.Bitmap(imgStream))
                {
                    iWidth = (long)bitmap.Width;
                    iHeight = (long)bitmap.Height;
                    iHorizontalResolution = bitmap.HorizontalResolution;
                    iVerticalResolution = bitmap.VerticalResolution;
                }
                imgStream.Seek(0, SeekOrigin.Begin);
            }
        }

        public List<IXLMarker> GetMarkers()
        {
            return Markers != null ? Markers : new List<IXLMarker>();
        }
        public void AddMarker(IXLMarker marker)
        {
            if (Markers == null)
            {
                Markers = new List<IXLMarker>();
            }
            Markers.Add(marker);
        }

        public String Name
        {
            get
            {
                return name;
            }
            set
            {
                name = value;
            }
        }

        public bool IsAbsolute
        {
            get
            {
                return isAbsolute;
            }
            set
            {
                isAbsolute = value;
            }
        }

        public String Type
        {
            get
            {
                return GetExtension(type);
            }
            set
            {
                try
                {
                    type = (ImagePartType)Enum.Parse(typeof(ImagePartType), value, true);
                }
                catch
                {
                    type = ImagePartType.Jpeg;
                }
            }
        }

        private String GetExtension(ImagePartType type)
        {
            return type.ToString();
        }

        public ImagePartType GetImagePartType()
        {
            return type;
        }
    }
}