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.Xe.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.Xe.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.Xe.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获取像素数据转换为位图

如何计算位图的平均 rgb 颜色值

从 24bpp 位图中获取每个像素的 RGB 值,以便在 C 中转换为 GBA 格式

如何提供 AddRange 以获取 C# 中的所有数据?

C#位图从像素中读取不正确的颜色

C#如何从表单中的文本框中获取文本,从不同的类调用