如果加载的图像来自资源,如何在 pictureBox 中放置边框颜色?
How can I place a border color in a pictureBox if the image loaded in it is from the resources?
我使用资源中的默认图像设置我的图片框:
public Form1()
{
InitializeComponent();
pictureBox1.Image = Properties.Resources.default_Employee_Image;
}
当我用这段代码检查pictureBox中的图片是否来自资源时,它没有绘制边框:
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
//pictureBox border color
Color themeColor = Color.FromArgb(172, 188, 212);
if (pictureBox1.Image == null) //if image from db is null display default image
{
pictureBox1.Image = Properties.Resources.default_Employee_Image;
}
//if image is the default image: paint border
if (pictureBox1.Image == Properties.Resources.default_Employee_Image)
{
ControlPaint.DrawBorder(e.Graphics, pictureBox1.ClientRectangle, themeColor, ButtonBorderStyle.Solid);
}
}
此外,如果 pictureBox 中的图片是默认图片,我会将其保存为我的数据库中的 null。
我只想在加载默认图像时有边框。如果我 select 另一个图像,边框应该消失。
如果 pictureBox 有默认图像,它应该看起来像这样(这意味着我还没有 select编辑用户的照片):
但是如果我的 pictureBox 中的图片不是默认图片-(我的资源中的图片),[这意味着我已经 select编辑了一张图片] 它应该是这样的:
而不是这样:
pictureBox1.Image == Properties.Resources.SomeImage
永远不会 return true
,因为每次调用 Properties.Resources.SomeImage
时,它 return 都是图像的新实例。
您不需要跟踪分配的图像;相反,您需要跟踪 状态 。您可以使用以下任一选项:
依靠一个标志: 你可以在表单级别设置一个像 bool isDefaultImage = true;
这样的标志,如果在你的应用程序的某个时刻你改变了图像,将其设置为 true。像这样:
if(isDefaultImage)
{
//draw border
}
依靠 Model/DataSource: 你也可以依靠你的 model/data 源值而不是检查 UI元素,检查用户是否有头像。像这样:
if(myUserObject.ProfilePicture == null)
{
//draw border
}
比较两张图片
无论如何,如果您有兴趣比较两个 Image
对象以查看它们是否是相同的图像,您可以使用以下方法:
public bool AreImagesEqual(Image img1, Image img2)
{
ImageConverter converter = new ImageConverter();
byte[] bytes1 = (byte[])converter.ConvertTo(img1, typeof(byte[]));
byte[] bytes2 = (byte[])converter.ConvertTo(img2, typeof(byte[]));
return Enumerable.SequenceEqual(bytes1, bytes2);
}
那么你可以这样使用它:
using(var image = Properties.Resources.DefaultImage)
{
var isDefaultImage = AreImagesEqual(pictureBox1.Image, image);
if(isDefaultImage)
{
//draw border
}
}
我找到了解决我的问题的方法,我改变了我的方法(依靠标志方法 [by @Reza Aghaei]),而不是将 pictureBox 图像与资源图像进行比较,我只是检查是否 pictureBox1.Tag是否为空:
在我的构造函数上:
public Form1()
{
InitializeComponent();
pictureBox1.Image = Properties.Resources.default_Employee_Image; //the default image from resources
pictureBox1.Image = null;
}
在我的 dataGridView 单元格点击事件中:
private void dataGridView_CellClick(object sender, DataGridViewCellEventArgs e)
{
try
{
if (e.RowIndex != -1)
{
//Display user image
using (SqlConnection con = new SqlConnection(connectionStringConfig))
using (SqlCommand sqlCmd = new SqlCommand("SELECT user_image FROM dbo.Employee_Image WHERE employee_id=@employee_id", con))
{
con.Open();
sqlCmd.Parameters.Add("@employee_id", SqlDbType.NVarChar).Value = EmployeeId;
using (SqlDataReader reader = sqlCmd.ExecuteReader())
{
if (reader.HasRows)
{
reader.Read();
pictureBox1.Image = ImageOperations.BytesToImage((byte[])(reader.GetValue(0)));
if (reader.GetValue(0) == null) //if image is null add border color to tag
{
pictureBox1.Tag = my_color_here;
}
else
{
pictureBox1.Tag = null;
}
}
else
{
pictureBox1.Image = null;
}
}
}
}
}
catch (Exception ex)
{
MessageBox.Show($"Something is wrong with the selected record! \nError: { ex.GetType().FullName }");
}
}
ImageOperations 中的 BytesToImage 方法 class:
public static Image BytesToImage(byte[] buffer) //Get image from database
{
using (MemoryStream ms = new MemoryStream(buffer))
{
return Image.FromStream(ms);
}
}
在我的 pictureBox 绘画事件中:
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
//if image is not present in the picturebox -> paint its border
if (pictureBox1.Image == null)
{
pictureBox1.Tag = my_color_here;
pictureBox1.Image = Properties.Resources.default_Employee_Image;
}
if (pictureBox1.Tag != null) //if tag has a value -> paint the border (this happens if image form db is null)
{
ControlPaint.DrawBorder(e.Graphics, pictureBox1.ClientRectangle, my_color_here, ButtonBorderStyle.Solid);
}
}
我使用资源中的默认图像设置我的图片框:
public Form1()
{
InitializeComponent();
pictureBox1.Image = Properties.Resources.default_Employee_Image;
}
当我用这段代码检查pictureBox中的图片是否来自资源时,它没有绘制边框:
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
//pictureBox border color
Color themeColor = Color.FromArgb(172, 188, 212);
if (pictureBox1.Image == null) //if image from db is null display default image
{
pictureBox1.Image = Properties.Resources.default_Employee_Image;
}
//if image is the default image: paint border
if (pictureBox1.Image == Properties.Resources.default_Employee_Image)
{
ControlPaint.DrawBorder(e.Graphics, pictureBox1.ClientRectangle, themeColor, ButtonBorderStyle.Solid);
}
}
此外,如果 pictureBox 中的图片是默认图片,我会将其保存为我的数据库中的 null。
我只想在加载默认图像时有边框。如果我 select 另一个图像,边框应该消失。
如果 pictureBox 有默认图像,它应该看起来像这样(这意味着我还没有 select编辑用户的照片):
但是如果我的 pictureBox 中的图片不是默认图片-(我的资源中的图片),[这意味着我已经 select编辑了一张图片] 它应该是这样的:
而不是这样:
pictureBox1.Image == Properties.Resources.SomeImage
永远不会 return true
,因为每次调用 Properties.Resources.SomeImage
时,它 return 都是图像的新实例。
您不需要跟踪分配的图像;相反,您需要跟踪 状态 。您可以使用以下任一选项:
依靠一个标志: 你可以在表单级别设置一个像
bool isDefaultImage = true;
这样的标志,如果在你的应用程序的某个时刻你改变了图像,将其设置为 true。像这样:if(isDefaultImage) { //draw border }
依靠 Model/DataSource: 你也可以依靠你的 model/data 源值而不是检查 UI元素,检查用户是否有头像。像这样:
if(myUserObject.ProfilePicture == null) { //draw border }
比较两张图片
无论如何,如果您有兴趣比较两个 Image
对象以查看它们是否是相同的图像,您可以使用以下方法:
public bool AreImagesEqual(Image img1, Image img2)
{
ImageConverter converter = new ImageConverter();
byte[] bytes1 = (byte[])converter.ConvertTo(img1, typeof(byte[]));
byte[] bytes2 = (byte[])converter.ConvertTo(img2, typeof(byte[]));
return Enumerable.SequenceEqual(bytes1, bytes2);
}
那么你可以这样使用它:
using(var image = Properties.Resources.DefaultImage)
{
var isDefaultImage = AreImagesEqual(pictureBox1.Image, image);
if(isDefaultImage)
{
//draw border
}
}
我找到了解决我的问题的方法,我改变了我的方法(依靠标志方法 [by @Reza Aghaei]),而不是将 pictureBox 图像与资源图像进行比较,我只是检查是否 pictureBox1.Tag是否为空:
在我的构造函数上:
public Form1()
{
InitializeComponent();
pictureBox1.Image = Properties.Resources.default_Employee_Image; //the default image from resources
pictureBox1.Image = null;
}
在我的 dataGridView 单元格点击事件中:
private void dataGridView_CellClick(object sender, DataGridViewCellEventArgs e)
{
try
{
if (e.RowIndex != -1)
{
//Display user image
using (SqlConnection con = new SqlConnection(connectionStringConfig))
using (SqlCommand sqlCmd = new SqlCommand("SELECT user_image FROM dbo.Employee_Image WHERE employee_id=@employee_id", con))
{
con.Open();
sqlCmd.Parameters.Add("@employee_id", SqlDbType.NVarChar).Value = EmployeeId;
using (SqlDataReader reader = sqlCmd.ExecuteReader())
{
if (reader.HasRows)
{
reader.Read();
pictureBox1.Image = ImageOperations.BytesToImage((byte[])(reader.GetValue(0)));
if (reader.GetValue(0) == null) //if image is null add border color to tag
{
pictureBox1.Tag = my_color_here;
}
else
{
pictureBox1.Tag = null;
}
}
else
{
pictureBox1.Image = null;
}
}
}
}
}
catch (Exception ex)
{
MessageBox.Show($"Something is wrong with the selected record! \nError: { ex.GetType().FullName }");
}
}
ImageOperations 中的 BytesToImage 方法 class:
public static Image BytesToImage(byte[] buffer) //Get image from database
{
using (MemoryStream ms = new MemoryStream(buffer))
{
return Image.FromStream(ms);
}
}
在我的 pictureBox 绘画事件中:
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
//if image is not present in the picturebox -> paint its border
if (pictureBox1.Image == null)
{
pictureBox1.Tag = my_color_here;
pictureBox1.Image = Properties.Resources.default_Employee_Image;
}
if (pictureBox1.Tag != null) //if tag has a value -> paint the border (this happens if image form db is null)
{
ControlPaint.DrawBorder(e.Graphics, pictureBox1.ClientRectangle, my_color_here, ButtonBorderStyle.Solid);
}
}