C#如何从拉伸的位图/图片框中获取像素
Posted
技术标签:
【中文标题】C#如何从拉伸的位图/图片框中获取像素【英文标题】:C# How to get pixel from stretched bitmap/picturebox 【发布时间】:2015-09-04 17:09:49 【问题描述】:好的,我有一个带有图像的图片框,其 sizeMode 设置为:StretchImage, 现在,我想获取我点击的像素。 (bitmap.GetPixel(x,y))。 但是当图像从正常大小拉伸时,我得到了原始像素。就像在拉伸之前存在的像素一样(如果这有意义吗?)
我的代码:
Private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
Bitmap img = (Bitmap)pictureBox1.Image;
var color = img.GetPixel(e.X, e.Y)
提前致谢
【问题讨论】:
【参考方案1】:应该有办法补偿图片框引起的拉伸因子。我正在考虑从图片框中获取拉伸的宽度和高度,以及原始图像的宽度和高度,计算拉伸因子,并将它们与e.X
和e.Y
坐标相乘。
可能是这样的:
Bitmap img = (Bitmap)pictureBox1.Image;
float stretch_X = img.Width / (float)pictureBox1.Width;
float stretch_Y = img.Height / (float)pictureBox1.Height;
var color = img.GetPixel((int)(e.X * stretch_X), (int)(e.Y * stretch_Y));
【讨论】:
谢谢,工作就像一个魅力! :)【参考方案2】:将e.X
和e.Y
与拉伸因子相除。这是拉伸后的图像填满了整个图片框。
Bitmap img = (Bitmap)pictureBox1.Image;
float factor_x = (float)pictureBox1.Width / img.Width;
float factor_y = (float)pictureBox1.Height / img.Height;
var color = img.GetPixel(e.X / factor_x, e.Y / factor_y)
通过这样做,我们确保e.X
和e.Y
不会超出原始图像的限制。
【讨论】:
【参考方案3】:您可以存储原始图像并保持原样。这比调整拉伸图像的大小并获得指定的像素后缀更容易。确保 e.X 和 e.Y 不会超出原始位图的范围。
private Bitmap _img;
public void LoadImage(string file)
// Get the image from the file.
pictureBox1.Image = Bitmap.FromFile(file);
// Convert it to a bitmap and store it for later use.
_img = (Bitmap)pictureBox1.Image;
// Code for stretching the picturebox here.
// ...
private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
var color = _img.GetPixel(e.X, e.Y);
编辑:无视。马克西米利安的答案更好。
【讨论】:
以上是关于C#如何从拉伸的位图/图片框中获取像素的主要内容,如果未能解决你的问题,请参考以下文章
android从onPreviewFrame获取像素数据转换为位图