私は、すべてのピクセルを取得し、Colors
のリストに保存することにより、与えられた画像の最適なパレット(GIF、最大256色用)を計算しようとしています。Pixels + OrderBy最も頻繁な色を取得
var bmp = new WriteableBitmap(bitmapSource);
bmp.Lock();
int stride = bmp.PixelWidth * 4;
int size = bmp.PixelHeight * stride;
var imgData = new byte[size];
//int index = y * stride + 4 * x; //To acess a specific pixel.
Marshal.Copy(bmp.BackBuffer, imgData, 0, imgData.Length);
bmp.Unlock();
var colorList = new List<Color>();
//I'm not sure if this is right.
for (int index = 0; index < imgData.Length - 1; index += 4)
{
colorList.Add(Color.FromArgb(imgData[index], imgData[index + 1],
imgData[index + 2], imgData[index + 3]));
}
//Here is the main problem.
var palette = colorList.Distinct().Take(255);
現在のところ、すべての色を区別することができ、最初の255色しか使用できません。しかし、私はまず使い方で注文する必要があります。どうやってやるの?
また、他の方法がありますか?
簡単な考えとして、辞書には色をキーとして使用し、その色のピクセル数をカウントする値はintとしてください。 – Pikoh
私はそれについて考えていましたが、ループの中で色を数え、 'Dictionary'を更新する必要がありました。 –
おそらくKのような何かをしたいのは、Kの最も一般的な色を選択するのではなく、クラスタリングを意味します。 –