Java图像采样功能C#

时间:2016-08-24 08:35:42

标签: java c#

我目前正在尝试将图像编辑应用程序从Java移植到C#,并且我已经通过 java.awt.image.BandedSampleModel 包中的以下方法遇到了这个问题:

  • int getSample(int x,int y,int band,int value)
  • void setSample(int x,int y,int band,int value)

原始Java代码:

    public int getSample(int x, int y, int band)
    {
        return image.getRaster().getSample(x, y, band);
    }

    public void setSample(int x, int y, int band, int value)
    {
        image.getRaster().setSample(x, y, band, value);
    }

问题如下:

  1. 实际getSamplesetSample方法有什么作用?据我所知,它们用于获取和设置(x,y)位置中像素的值(R + G + B之和)。什么' int band'是否包含在方法的签名中?
  2. 据我所知,默认的C#API中没有模拟功能。如果是这样,如何在C#上重写这些函数以具有相同的签名和行为?
  3. 我们非常感谢代码示例。

1 个答案:

答案 0 :(得分:1)

  1. 在Java应用程序中查看这些函数的用法后,我发现'band'参数可以在[0,2]的范围内。此参数指定RGB通道编号(0 - 红色,1 - 贪婪,2 - 蓝色)。
  2. 由于我已经设法找出这种方法的目的,我很清楚如何重写它们。我已经成功移植了应用程序,这两种方法(在C#和Java上)具有相同的行为。

    public int getSample(int x, int y, int band)
    {
        //return image.getRaster().getSample(x, y, band);
        var pixelColor = image.GetPixel(x, y);
        switch (band)
        {
            case 0: return pixelColor.R;
            case 1: return pixelColor.G;
            case 2: return pixelColor.B;
        }
        throw new ArgumentException(nameof(band));
    }
    
    public void setSample(int x, int y, int band, int value)
    {
        //image.getRaster().setSample(x, y, band, value);
        var oldColor = image.GetPixel(x, y);
        Color newColor;
        switch (band)
        {
            case 0:
                newColor = Color.FromArgb(255, value, oldColor.G, oldColor.B);
                break;
            case 1:
                newColor = Color.FromArgb(255, oldColor.R, value, oldColor.B);
                break;
            case 2:
                newColor = Color.FromArgb(255, oldColor.R, oldColor.G, value);
                break;
            default:
                throw new ArgumentException(nameof(band));
        }
        image.SetPixel(x, y, newColor);
    }