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 属性 /// /// 背景图片文件全名 /// public string BackgroundImageName { get { return txtBackgroundName.Text; } } /// /// 背景图片 /// public new Image BackgroundImage { get { return _backgroundImage; } } /// /// LayoutBox /// public LayoutBox LayoutBox { get { return _layoutBox; } } #endregion 属性 #region 构造函数 /// /// 构造函数 /// 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 函数 /// /// 压缩图片为jpeg /// /// 压缩前的图片 /// 图片品质。例:25L /// 压缩后的jpeg图片 /// 压缩后的图片大小 /// 是否压缩成功 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; } } /// /// 获得图片的尺寸。单位:byte /// /// 图片 /// 图片的尺寸。单位:byte 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; } } /// /// 显示图片尺寸 /// private void RefreshImageSizeLabel(Image image) { long size = GetImageSize(image); RefreshImageSizeLabel(size); } /// /// 显示图片尺寸 /// /// private void RefreshImageSizeLabel(long size) { if (0 < size) { lblImageSize.Text = string.Format("{0:N0}Kbyte", size / 1024); } else { lblImageSize.Text = string.Empty; } } /// /// 按钮可用状态设置。 /// 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 事件处理 /// /// Load /// /// /// private void BackgroundSetting_Load(object sender, EventArgs e) { RefreshImageSizeLabel(_layoutBox.BackgroundImage); SetButtonState(); } /// /// 【删除】按钮点击 /// /// 指定的对象 /// 提供的事件数据 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(); } } /// /// 【选择】按钮点击 /// /// 指定的对象 /// 提供的事件数据 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(); } } /// /// 【确定】按钮点击 /// /// 指定的对象 /// 提供的事件数据 private void btnOK_Click(object sender, EventArgs e) { if (_backgroundImage != null) { DialogResult = DialogResult.OK; } else { DialogResult = DialogResult.Cancel; } Close(); } /// /// 【另存为】按钮点击 /// /// 指定的对象 /// 提供的事件数据 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); } } /// /// 【压缩图片】按钮点击 /// /// 指定的对象 /// 提供的事件数据 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 事件处理 } }