我遇到了在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应用程序的直方图表示的任何代码,或者非常感谢所有其他代码。
答案 0 :(得分:0)
虽然您可以使用JP Alioto指出的图表控件,但直方图往往代表 lot 数据。仅在您的样本中,您将渲染256条* 4轴(R,G,B,L)。图表控件的问题在于它们通常喜欢将它们绘制的水合数据的集合(或数组)交给它们,并且它们倾向于保留在内存中。像你这样的直方图需要在内存中有1024个对象(256 * 4)并作为一个整体传递给图表。它只是不能很好地利用内存管理。
另一种选择当然是自己画画。但正如您所发现的那样,逐像素绘制可能会有点痛苦。在我看来,最好的答案是同意Shahar并建议您在CodePlex上使用WriteableBitmapEx。
http://writeablebitmapex.codeplex.com
WriteableBitmapEx包含用于绘制非常快速的线条和矩形等形状的方法。您可以在枚举时绘制数据(而不是一次将所有数据都存储在内存中),结果是一个很好的紧凑图像,已经“位图缓存”(意味着它渲染速度非常快,因为它没有在每一帧上重新绘制。)
开发人员的支持,设计支持和更加出色的善意:http://bit.ly/winappsupport