C# 转换简单的JavaScript代码
我一直在尝试转换从图像中获得主色调的颜色,但迄今为止没有成功。我得到了C# 转换简单的JavaScript代码,c#,javascript,C#,Javascript,我一直在尝试转换从图像中获得主色调的颜色,但迄今为止没有成功。我得到了colorCount和color变量的错误。我不知道用于这些变量的合适和等效的数据类型。这是我的密码: public string dominantColor(Bitmap img) { int[] colorCount = new int[0]; int maxCount = 0; string dominantColor = ""; // data is an ar
colorCount
和color
变量的错误。我不知道用于这些变量的合适和等效的数据类型。这是我的密码:
public string dominantColor(Bitmap img)
{
int[] colorCount = new int[0];
int maxCount = 0;
string dominantColor = "";
// data is an array of a series of 4 one-byte values representing the rgba values of each pixel
Bitmap Bmp = new Bitmap(img);
BitmapData BmpData = Bmp.LockBits(new Rectangle(0, 0, Bmp.Width, Bmp.Height), ImageLockMode.ReadOnly, Bmp.PixelFormat);
byte[] data = new byte[BmpData.Stride * Bmp.Height];
for (int i = 0; i < data.Length; i += 4)
{
// ignore transparent pixels
if (data[i+3] == 0)
continue;
string color = data[i] + "." + data[i+1] + "," + data[i+2];
// ignore white
if (color == "255,255,255")
continue;
if (colorCount[color] != 0)
colorCount[color] = colorCount[color] + 1;
else
colorCount[color] = 0;
// keep track of the color that appears the most times
if (colorCount[color] > maxCount)
{
maxCount = colorCount[color];
dominantColor = color.ToString;
}
}
string rgb = dominantColor.Split(",");
return rgb;
}
公共字符串主色(位图img)
{
int[]colorCount=新int[0];
int maxCount=0;
字符串主导颜色=”;
//数据是一系列4个单字节值的数组,表示每个像素的rgba值
位图Bmp=新位图(img);
BitmapData BmpData=Bmp.LockBits(新矩形(0,0,Bmp.Width,Bmp.Height),ImageLockMode.ReadOnly,Bmp.PixelFormat);
字节[]数据=新字节[BmpData.Stride*Bmp.Height];
对于(int i=0;imaxCount)
{
maxCount=颜色计数[颜色];
显性颜色=color.ToString;
}
}
字符串rgb=dominantColor.Split(“,”);
返回rgb;
}
我将为您提供代码的完整托管版本:
static Color dominantColor(Bitmap img)
{
Hashtable colorCount = new Hashtable();
int maxCount = 0;
Color dominantColor = Color.White;
for (int i = 0; i < img.Width; i++)
{
for (int j = 0; j < img.Height; j++)
{
var color = img.GetPixel(i, j);
if (color.A == 0)
continue;
// ignore white
if (color.Equals(Color.White))
continue;
if (colorCount[color] != null)
colorCount[color] = (int)colorCount[color] + 1;
else
colorCount.Add(color, 0);
// keep track of the color that appears the most times
if ((int)colorCount[color] > maxCount)
{
maxCount = (int)colorCount[color];
dominantColor = color;
}
}
}
return dominantColor;
}
static Color-dominantColor(位图img)
{
Hashtable colorCount=新Hashtable();
int maxCount=0;
颜色主导色=颜色。白色;
对于(int i=0;imaxCount)
{
maxCount=(int)colorCount[color];
显性颜色=颜色;
}
}
}
返回主色;
}
那么这里有什么区别呢?
-我使用一个哈希表而不是数组(你从来没有重新定义过它的维度——使用JavaScript中的可扩展对象的最好方法就是哈希表)
-我更喜欢使用已经包含的结构颜色(为Alpha、红色、绿色和蓝色节省4个字节)
-我还进行比较并返回此结构(然后您可以自由地执行任何您想执行的操作-在JavaScript中,使用这些字符串只是一种解决方法,因为浏览器只是为您提供这样的RGB(a)字符串)
代码中的另一个问题是包含byte[]data=new byte[BmpData.Stride*Bmp.Height]的行;-数组已创建并初始化,但没有数据(.NET将删除所有以前的数据,从而产生大量零)。因此,你不会在任何地方
我的版本的缺点是它确实非常小(这就是你们的锁具发挥作用的地方)。如果您愿意,我可以给您一个非托管版本(使用锁位和不安全块)。这取决于性能是否对您很重要,以及您是否感兴趣 到底是什么问题?你能再解释一下吗?
我的colorCount和color变量出现了错误
到底是哪个错误?@Fuex我从string到int的转换错误。基本上,我不确定我是否为color变量使用了正确的数据类型,我尝试了不同的数据类型,但仍然出现了转换错误。1。colorCount没有字符串索引器;2.colorCount是长度为0的int数组,因此colorCount[color]抛出错误我想这一行:int[]colorCount=new int[0]
这一行:string color=data[i]+“+data[i+1]+”,“+data[i+2]代码>是错误的来源。这:colorCount.Add(color,0)代码>必须是:colorCount.Add(color,1)代码>是的,这是真的,但从何处开始并不重要,因为从未找到的颜色不会出现在哈希表中,并且每种颜色都必须以相同的数字开始(在本例中为0)。当您编写时,它不会出现问题,因为0基中最大的颜色也将是1基中最大的颜色,这只会让我抓狂。。。但是当我观看原始代码时,它总是返回0,不是吗?原始代码还是我的版本?原来的一个总是返回零,因为数组分配不正确(他只是通过一个空数组,结果根本没有计数-所以是的)。是的,我写了关于原来的一个。。。即使是数组也将被正确定义,!=0
永远不会为真,因此每个项目都将为0