0
 public static long[] GetHistogramRGB(Bitmap b)
        {
            long[] myHistogramBlue = new long[256];
            long[] myHistogramGreen = new long[256];
            long[] myHistogramRed = new long[256];
            BitmapData bmData = null;

            try
            {
                //Lock it fixed with 32bpp
                bmData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
                int scanline = bmData.Stride;
                System.IntPtr Scan0 = bmData.Scan0;
                unsafe
                {
                    byte* p = (byte*)(void*)Scan0;
                    int nWidth = b.Width;
                    int nHeight = b.Height;
                    for (int y = 0; y < nHeight; y++)
                    {
                        for (int x = 0; x < nWidth; x++)
                        {
                            long Temp = 0;
                            Temp += p[0];
                            myHistogramBlue[Temp]++;

                            long Temp2 = 0;
                            Temp2 += p[1];
                            myHistogramGreen[Temp2]++;

                            long Temp3 = 0;
                            Temp3 += p[2];
                            myHistogramRed[Temp3]++;

                            //we do not need to use any offset, we always can increment by pixelsize when
                            //locking in 32bppArgb - mode
                            p += 4;
                        }
                    }
                }
                b.UnlockBits(bmData);
            }
            catch
            {
                try
                {
                    b.UnlockBits(bmData);
                }
                catch
                {
                }
            }

            List<long[]> l = new List<long[]>();
            l.Add(myHistogramBlue);
            l.Add(myHistogramGreen);
            l.Add(myHistogramRed);

            return l;

        }

最後の行で l; を返します。エラーが発生します:

Cannot implicitly convert type 'System.Collections.Generic.List<long[]>' to 'long[]'

どうすれば修正できますか?

私はこのようにしようとしました:

public static long[] GetHistogramRGB(Bitmap b)
        {
            long[] myHistogramBlue = new long[256];
            long[] myHistogramGreen = new long[256];
            long[] myHistogramRed = new long[256];
            BitmapData bmData = null;

            try
            {
                //Lock it fixed with 32bpp
                bmData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
                int scanline = bmData.Stride;
                System.IntPtr Scan0 = bmData.Scan0;
                unsafe
                {
                    byte* p = (byte*)(void*)Scan0;
                    int nWidth = b.Width;
                    int nHeight = b.Height;
                    for (int y = 0; y < nHeight; y++)
                    {
                        for (int x = 0; x < nWidth; x++)
                        {
                            long Temp = 0;
                            Temp += p[0];
                            myHistogramBlue[Temp]++;

                            long Temp2 = 0;
                            Temp2 += p[1];
                            myHistogramGreen[Temp2]++;

                            long Temp3 = 0;
                            Temp3 += p[2];
                            myHistogramRed[Temp3]++;

                            //we do not need to use any offset, we always can increment by pixelsize when
                            //locking in 32bppArgb - mode
                            p += 4;
                        }
                    }
                }
                b.UnlockBits(bmData);
            }
            catch
            {
                try
                {
                    b.UnlockBits(bmData);
                }
                catch
                {
                }
            }

            var l = new Dictionary<string, long[]>();
            l.Add("blue", myHistogramBlue);
            l.Add("green", myHistogramGreen);
            l.Add("red", myHistogramRed);

            return l;

        }

Error 2 Cannot implicitly convert type 'System.Collections.Generic.Dictionary<string,long[]>' to 'long[]'

そして、この関数を使用して、次のような別のクラスで呼び出しています。

long[] HistogramsValuesRGB = Form1.GetHistogramRGB(original_bmp);

そして、これはエラーを与えません。エラーは、戻り値 l; の Form1 の関数自体にあります。

4

7 に答える 7

6

あなたlは配列のリストですが、構造体の戻り値の型は単一の配列です。

単一の配列を返す必要がある場合:

List<long> l = new List<long>();
l.AddRange(myHistogramBlue);
l.AddRange(myHistogramGreen);
l.AddRange(myHistogramRed);

return l.ToArray();

配列のリストを返す必要がある場合は、戻り値の型を からlong[]に変更しList<long[]>ます。ただし、この場合、おそらく a を使用して、Dictionary<string,long[]>各配列を名前に対して保存します。

var l = new Dictionary<string,long[]>();
l.Add("blue", myHistogramBlue);
l.Add("green", myHistogramGreen);
l.Add("red", myHistogramRed);
于 2012-12-12T11:52:30.593 に答える
1

戻り値の型が関数と同じ型ではありません:

functiontype:  long[]
return type: List<long[]>

そのうちの 1 つを他のものと一致するように変更します。

于 2012-12-12T11:54:59.127 に答える
1

メソッドは long の配列 ( long[]) を返すことになっています。

long の配列のリスト ( ) を返そうとしていますList<long[]>

次のいずれかを実行できます。

A)メソッドシグネチャを変更して返すList<long[]>

また

B) を使用して、long のリストを long の配列にフラット化しSelectMany()ます。すなわち

return l.SelectMany(v => v).ToArray();

編集

C)@Odedが提案したもの:)

于 2012-12-12T11:53:34.640 に答える
1

ご注文内容に応じて...

for(int i = 0; i < myHistogramBlue.Length; i++)
{
l.Add(myHistogramBlue[i]);
l.Add(myHistogramGreen[i]);
l.Add(myHistogramRed[i]);
}

return l.toArray();`
于 2012-12-12T11:56:12.683 に答える
0

l.ToArray();コード内の戻り値の型にlong[] , List<long[]>互換性がないことを返す必要があります。

于 2012-12-12T11:54:36.207 に答える
0

あなたの戻り値はlong[]であり、あなたの戻り値はList<long[]>

宣言を次のように変更します。

public static List<long[]> GetHistogramRGB(Bitmap b)
于 2012-12-12T11:53:41.173 に答える
-1

を返そうとしています

List<long[]> 

なので

long[]

コードを次のように置き換えます。

List<long> l = new List<long>();
l.Add(myHistogramBlue);
l.Add(myHistogramGreen);
l.Add(myHistogramRed);

return l.ToArray();
于 2012-12-12T11:53:19.167 に答える