C# WinRT应用程序中RGB值的直方图图

C# WinRT应用程序中RGB值的直方图图,c#,windows-8,plot,windows-runtime,histogram,C#,Windows 8,Plot,Windows Runtime,Histogram,我在WinRT应用程序中创建图像的直方图表示时遇到问题。我想做的是由四个直方图组成,分别是一幅图像的红色、绿色、蓝色和亮度 我的主要问题是如何实际绘制直方图的图片,以便在屏幕上显示它。到目前为止,我的代码很好。。。凌乱的是,我已经搜索了很多关于这个主题的内容,大部分结果都是Java代码,我试图用C#来翻译它,但API是完全不同的。。。也有一次来自福格的尝试但那是winforms 这是我的凌乱代码,我知道它看起来很糟糕,但我正在努力使这项工作首先: public static WriteableB

我在WinRT应用程序中创建图像的直方图表示时遇到问题。我想做的是由四个直方图组成,分别是一幅图像的红色、绿色、蓝色和亮度

我的主要问题是如何实际绘制直方图的图片,以便在屏幕上显示它。到目前为止,我的代码很好。。。凌乱的是,我已经搜索了很多关于这个主题的内容,大部分结果都是Java代码,我试图用C#来翻译它,但API是完全不同的。。。也有一次来自福格的尝试但那是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);
    }
public static WriteableBitmap CreateHistorogramRepresentation(long[]HistorogramData,HistorogramType类型)
{
//我试图确定直方图条的最大高度,所以
//我可以确定图像的最大高度,然后我会重新制作它
//以较低的分辨率:
var max=historogramdata[0];
//确定最大值、直方图中的最高条、图像的初始高度。
for(int i=0;i最大值)
max=历史记录数据[i];
}
var位图=新的可写位图(256500);
//根据直方图的类型设置要绘制的颜色:
var color=颜色。白色;
开关(类型)
{
病例组织切片类型。蓝色:
{
颜色=颜色。蓝色;
打破
}
病例组织切片类型。绿色:
{
颜色=颜色。褐色;
打破
}
病例组织切片类型。红色:
{
颜色=颜色。耐火砖;
打破
}
病例组织图类型。亮度:
{
颜色=颜色。深灰色;
打破
}
}
//计算缩放器以将条形图缩放到实际图像尺寸:
var-scaler=1;
同时(最大/缩放器>500)
{
scaler++;
}
var stream=bitmap.PixelBuffer.AsStream();
var streamBuffer=新字节[stream.Length];
//最初制作白色图像:
对于(var i=0;i
这创建了一个非常糟糕的直方图表示,它甚至没有用相应的颜色给它上色。。。它不能正常工作,我正在努力修复它


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

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

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

WriteableBitmapEx包括用于绘制速度非常快的线和矩形等形状的方法。您可以在枚举数据时绘制数据(而不必一次将其全部存储在内存中),结果是一个已经“位图缓存”的非常紧凑的图像(这意味着它渲染得非常快,因为它不必在每一帧上重新绘制)


开发支持、设计支持和更多令人敬畏的优点:

为什么不使用第三方控件?试着使用WriteableBitmapEx CodePlex项目——它实际上非常容易使用,并且消除了您需要做的大量工作。感谢WriteableBitmap扩展,我已经在我的项目的其他部分使用了它,但是。。。我笨手笨脚的,我完全忘记了做我工作的那个拉丝法。非常感谢。