| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457 |
-
- using System;
- using System.Drawing;
- using System.Drawing.Imaging;
- using System.IO;
- using System.Windows.Forms;
- namespace Dongke.WinForm.Controls.InvoiceLayout
- {
- internal partial class BackgroundSetting : Setting
- {
- #region 成员变量
- private Image _backgroundImage = null; // 背景图片
- private LayoutBox _layoutBox = null; // LayoutBox
- #endregion
- #region 属性
- /// <summary>
- /// 背景图片文件全名
- /// </summary>
- public string BackgroundImageName
- {
- get
- {
- return txtBackgroundName.Text;
- }
- }
- /// <summary>
- /// 背景图片
- /// </summary>
- public new Image BackgroundImage
- {
- get
- {
- return _backgroundImage;
- }
- }
- /// <summary>
- /// LayoutBox
- /// </summary>
- public LayoutBox LayoutBox
- {
- get
- {
- return _layoutBox;
- }
- }
- #endregion 属性
- #region 构造函数
- /// <summary>
- /// 构造函数
- /// </summary>
- public BackgroundSetting(LayoutBox layoutBox)
- {
- _layoutBox = layoutBox;
- InitializeComponent();
- // 获取背景图片名称,不为空时设置删除按钮的状态为可用
- if (!string.IsNullOrEmpty(layoutBox.BackgroundImageName))
- {
- btnRemove.Enabled = true;
- txtBackgroundName.Text = layoutBox.BackgroundImageName;
- }
- // 打开选择图片的对话框
- openFileDialog.Title = this.Text;
- openFileDialog.Filter = LayoutConsts.FILE_DIALOG_IMAGE_FILTER;
- openFileDialog.FilterIndex = 6;
- string directory = Environment.GetFolderPath(Environment.SpecialFolder.MyPictures);
- if (Directory.Exists(directory))
- {
- openFileDialog.InitialDirectory = directory;
- }
- else
- {
- openFileDialog.InitialDirectory =
- Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
- }
- // 图片另存为时,保存图片对话框
- saveFileDialog.Title = Text;
- saveFileDialog.FileName = _layoutBox.BackgroundImageName;
- saveFileDialog.Filter = LayoutConsts.FILE_DIALOG_IMAGE_FILTER;
- saveFileDialog.FilterIndex = 6;
- if (Directory.Exists(directory))
- {
- saveFileDialog.InitialDirectory = directory;
- }
- else
- {
- saveFileDialog.InitialDirectory =
- Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
- }
- }
- #endregion 构造函数
- #region 函数
- /// <summary>
- /// 压缩图片为jpeg
- /// </summary>
- /// <param name="image">压缩前的图片</param>
- /// <param name="qualityValue">图片品质。例:25L</param>
- /// <param name="newImage">压缩后的jpeg图片</param>
- /// <param name="newSize">压缩后的图片大小</param>
- /// <returns>是否压缩成功</returns>
- private static bool ConvertToJpegImage(Image image, long qualityValue, out Image newImage, out long newSize)
- {
- newImage = null;
- newSize = 0;
- ImageCodecInfo jpegCodecInfo = null;
- ImageCodecInfo[] encoders = ImageCodecInfo.GetImageEncoders();
- for (int i = 0; i < encoders.Length; i++)
- {
- if (encoders[i].MimeType.Equals("image/jpeg"))
- {
- jpegCodecInfo = encoders[i];
- break;
- }
- }
- if (jpegCodecInfo == null)
- {
- MessageBox.Show("图片转换失败,请手动调整图像。",
- "图片转换",
- MessageBoxButtons.OK,
- MessageBoxIcon.Error,
- MessageBoxDefaultButton.Button1);
- return false;
- }
- Encoder ecoderParamQuality = Encoder.Quality;
- EncoderParameters encoderParams = new EncoderParameters(1);
- encoderParams.Param[0] = new EncoderParameter(ecoderParamQuality, qualityValue);
- // Save
- try
- {
- MemoryStream mstream = new MemoryStream();
- image.Save(mstream, jpegCodecInfo, encoderParams);
- newImage = Image.FromStream(mstream);
- newSize = mstream.Length;
- return true;
- }
- catch(Exception)
- {
- MessageBox.Show("图片转换失败,请手动调整图像。",
- "图片转换",
- MessageBoxButtons.OK,
- MessageBoxIcon.Error,
- MessageBoxDefaultButton.Button1);
- return false;
- }
- }
- /// <summary>
- /// 获得图片的尺寸。单位:byte
- /// </summary>
- /// <param name="image">图片</param>
- /// <returns>图片的尺寸。单位:byte</returns>
- private static long GetImageSize(Image image)
- {
- if (image == null)
- {
- return 0;
- }
- long size = 0;
- try
- {
- using (MemoryStream mstream = new MemoryStream())
- {
- image.Save(mstream, image.RawFormat);
- size = mstream.Length;
- }
- return size;
- }
- catch
- {
- return 0;
- }
- }
- /// <summary>
- /// 显示图片尺寸
- /// </summary>
- private void RefreshImageSizeLabel(Image image)
- {
- long size = GetImageSize(image);
- RefreshImageSizeLabel(size);
- }
- /// <summary>
- /// 显示图片尺寸
- /// </summary>
- /// <param name="size"></param>
- private void RefreshImageSizeLabel(long size)
- {
- if (0 < size)
- {
- lblImageSize.Text = string.Format("{0:N0}Kbyte", size / 1024);
- }
- else
- {
- lblImageSize.Text = string.Empty;
- }
- }
- /// <summary>
- /// 按钮可用状态设置。
- /// </summary>
- private void SetButtonState()
- {
- // 另存为
- btnSaveAs.Enabled = (_layoutBox.BackgroundImage != null);
- // 图片压缩
- btnCompress.Enabled = (_layoutBox.BackgroundImage != null || _backgroundImage != null);
- // 删除
- btnRemove.Enabled = (_layoutBox.BackgroundImage != null || _backgroundImage != null);
- // 确定
- btnOK.Enabled = true;
- // 取消
- btnCancel.Enabled = true;
- }
- #endregion 函数
- #region 事件处理
- /// <summary>
- /// Load
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="e"></param>
- private void BackgroundSetting_Load(object sender, EventArgs e)
- {
- RefreshImageSizeLabel(_layoutBox.BackgroundImage);
- SetButtonState();
- }
- /// <summary>
- /// 【删除】按钮点击
- /// </summary>
- /// <param name="sender">指定的对象</param>
- /// <param name="e">提供的事件数据</param>
- private void btnRemove_Click(object sender, System.EventArgs e)
- {
- DialogResult dr = MessageBox.Show("是否删除背景图片?",
- Text,
- MessageBoxButtons.YesNo,
- MessageBoxIcon.Question,
- MessageBoxDefaultButton.Button1);
- if (dr == DialogResult.Yes)
- {
- _backgroundImage = null;
- txtBackgroundName.Text = string.Empty;
- DialogResult = DialogResult.OK;
- Close();
- }
- }
- /// <summary>
- /// 【选择】按钮点击
- /// </summary>
- /// <param name="sender">指定的对象</param>
- /// <param name="e">提供的事件数据</param>
- private void btnReference_Click(object sender, System.EventArgs e)
- {
- try
- {
- if (openFileDialog.ShowDialog() == DialogResult.OK)
- {
- FileInfo fileInfo = new FileInfo(openFileDialog.FileName);
- Image image = null;
- if (fileInfo.Length > 0)
- {
- Stream imageStream = null;
- try
- {
- imageStream = fileInfo.Open(FileMode.Open,
- FileAccess.Read,
- FileShare.ReadWrite | FileShare.Delete);
- image = Image.FromStream(imageStream);
- MemoryStream mstream = new MemoryStream();
- image.Save(mstream, image.RawFormat);
- image = Image.FromStream(mstream);
- RefreshImageSizeLabel(mstream.Length);
- if (LayoutConsts.FILE_DIALOG_IMAGE_MAX_SIZE < mstream.Length)
- {
- DialogResult dr = MessageBox.Show(
- string.Format("图片的尺寸为{0},超过200Kbyte,是否对图片进行压缩?", lblImageSize.Text)
- + Environment.NewLine
- + Environment.NewLine
- + "※通常图片大小在100K字节以下足够了,大尺寸的图片会降低屏幕显示和打印的速度。",
- Text,
- MessageBoxButtons.YesNo,
- MessageBoxIcon.Question,
- MessageBoxDefaultButton.Button1);
- if (dr == DialogResult.Yes)
- {
- Image newImage;
- long newSize;
- ConvertToJpegImage(image, LayoutConsts.QUALITY_VALUE, out newImage, out newSize);
- image.Dispose();
- image = null;
- image = newImage;
- RefreshImageSizeLabel(newSize);
- }
- }
- else
- {
- }
- }
- finally
- {
- if (imageStream != null)
- {
- imageStream.Dispose();
- }
- }
- }
- else
- {
- MessageBox.Show("图片的大小为零,不能设置。",
- Text,
- MessageBoxButtons.OK,
- MessageBoxIcon.Error,
- MessageBoxDefaultButton.Button1);
- return;
- }
- txtBackgroundName.Text = Path.GetFileName(openFileDialog.FileName);
- if (_backgroundImage != null)
- {
- _backgroundImage.Dispose();
- }
- _backgroundImage = image;
- }
- }
- finally
- {
- SetButtonState();
- }
- }
- /// <summary>
- /// 【确定】按钮点击
- /// </summary>
- /// <param name="sender">指定的对象</param>
- /// <param name="e">提供的事件数据</param>
- private void btnOK_Click(object sender, EventArgs e)
- {
- if (_backgroundImage != null)
- {
- DialogResult = DialogResult.OK;
- }
- else
- {
- DialogResult = DialogResult.Cancel;
- }
- Close();
- }
- /// <summary>
- /// 【另存为】按钮点击
- /// </summary>
- /// <param name="sender">指定的对象</param>
- /// <param name="e">提供的事件数据</param>
- private void btnSaveAs_Click(object sender, EventArgs e)
- {
- if (_layoutBox.BackgroundImage == null || string.IsNullOrEmpty(_layoutBox.BackgroundImageName))
- {
- return;
- }
- saveFileDialog.FileName = _layoutBox.BackgroundImageName;
- if (DialogResult.OK != saveFileDialog.ShowDialog())
- {
- return;
- }
- using (Image image = (Image)_layoutBox.BackgroundImage.Clone())
- {
- image.Save(saveFileDialog.FileName);
- }
- }
- /// <summary>
- /// 【压缩图片】按钮点击
- /// </summary>
- /// <param name="sender">指定的对象</param>
- /// <param name="e">提供的事件数据</param>
- private void btnCompress_Click(object sender, EventArgs e)
- {
- Image target = null;
- if (_backgroundImage != null)
- {
- target = _backgroundImage;
- }
- else if (_layoutBox.BackgroundImage != null)
- {
- target = _layoutBox.BackgroundImage;
- }
- else
- {
- return;
- }
- long orgSize = GetImageSize(target);
- Image newImage;
- long newSize;
- ConvertToJpegImage(target, LayoutConsts.QUALITY_VALUE, out newImage, out newSize);
- if (newImage == null)
- {
- return;
- }
- if (orgSize < newSize)
- {
- if (newImage != null)
- {
- newImage.Dispose();
- newImage = null;
- }
- MessageBox.Show("背景图片压缩失败。",
- Text,
- MessageBoxButtons.OK,
- MessageBoxIcon.Information,
- MessageBoxDefaultButton.Button1);
- return;
- }
- if (_backgroundImage != null)
- {
- _backgroundImage.Dispose();
- }
- _backgroundImage = newImage;
- RefreshImageSizeLabel(newSize);
- MessageBox.Show("背景图片压缩完成。",
- Text,
- MessageBoxButtons.OK,
- MessageBoxIcon.Information,
- MessageBoxDefaultButton.Button1);
- }
- #endregion 事件处理
- }
- }
|