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 事件处理
}
}