直方图图的RGB值在WinRT应用程序

本文关键字:WinRT 应用程序 值在 RGB 直方图 | 更新日期: 2023-09-27 18:01:39

我在WinRT应用程序中创建图像的直方图表示时遇到了问题。我想为图像创建的直方图包括红色,绿色,蓝色,亮度的四个直方图。

我的主要问题是如何绘制该直方图的图片,以便我可以在屏幕上显示它。到目前为止,我的代码非常……混乱,我已经搜索了很多关于这个主题,主要是我的结果由Java代码组成,我试图以某种方式在c#中翻译它,但API是相当不同的…有一个尝试从AForge,但那是winforms…

这是我混乱的代码,我知道它看起来很糟糕,但我正在努力使它首先工作:

public static WriteableBitmap CreateHistogramRepresentation(long[] histogramData, HistogramType type)
    {
        //I'm trying to determine a max height of a histogram bar, so
        //I could determine a max height of the image that then I'll remake it
        //at a lower resolution :
        var max = histogramData[0];
        //Determine the max value, the highest bar in the histogram, the initial height of the image.
        for (int i = 0; i < histogramData.Length; i++)
        {
            if (histogramData[i] > max)
                max = histogramData[i];
        }
        var bitmap = new WriteableBitmap(256, 500);
        //Set a color to draw with according to the type of the histogram :
        var color = Colors.White;
        switch (type)
        {
            case HistogramType.Blue :
                {
                    color = Colors.RoyalBlue;
                    break;
                }
            case HistogramType.Green:
                {
                    color = Colors.OliveDrab;
                    break;
                }
            case HistogramType.Red:
                {
                    color = Colors.Firebrick;
                    break;
                }
            case HistogramType.Luminosity:
                {
                    color = Colors.DarkSlateGray;
                    break;
                }
        }
        //Compute a scaler to scale the bars to the actual image dimensions :
        var scaler = 1;
        while (max/scaler > 500)
        {
            scaler++;
        }
        var stream = bitmap.PixelBuffer.AsStream();
        var streamBuffer = new byte[stream.Length];
        //Make a white image initially :
        for (var i = 0; i < streamBuffer.Length; i++)
        {
            streamBuffer[i] = 255;
        }
        //Color the image :
        for (var i = 0; i < 256; i++) // i = column
        {
            for (var j = 0; j < histogramData[i] / scaler; j++) // j = line
            {
                streamBuffer[j*256*4 + i] = color.B; //the image has a  256-pixel width
                streamBuffer[j*256*4 + i + 1] = color.G;
                streamBuffer[j*256*4 + i + 2] = color.R;
                streamBuffer[j*256*4 + i + 2] = color.A;
            }
        }
        //Write the Pixel Data into the Pixel Buffer of the future Histogram image :
        stream.Seek(0, 0);
        stream.Write(streamBuffer, 0, streamBuffer.Length);
        return bitmap.Flip(WriteableBitmapExtensions.FlipMode.Horizontal);
    }

这创建了一个非常糟糕的直方图表示,它甚至没有使用相应的颜色着色…它不能正常工作,我正在努力解决它…

如果你能贡献一个链接,你可能知道任何代码的直方图表示WinRT应用程序或其他一切都是非常感谢。

直方图图的RGB值在WinRT应用程序

虽然您可以使用JP Alioto指出的图表控件,但直方图倾向于表示大量的数据。仅在您的示例中,您就渲染256条* 4轴(R,G,B,L)。图表控件的问题在于,它们通常喜欢处理数据的集合(或数组),这些数据是它们绘制的,并且它们倾向于保存在内存中。像你这样的直方图需要在内存中有1024个对象(256 * 4),并作为一个整体传递给图表。这不是内存管理的好方法。

另一种选择当然是自己画。但正如您所发现的,逐像素绘制可能有点痛苦。在我看来,最好的答案是同意Shahar的观点,并建议你在CodePlex上使用WriteableBitmapEx。

http://writeablebitmapex.codeplex.com

WriteableBitmapEx包括绘制直线和矩形等形状的方法,这些方法非常非常快。你可以在你枚举的时候绘制数据(而不是一次把所有的数据都放在内存中),结果是一个漂亮的压缩图像,已经是"位图缓存"(这意味着它渲染得非常快,因为它不需要在每帧上重新绘制)。

开发支持,设计支持和更多令人敬畏的善良在路上:http://bit.ly/winappsupport