1

常にサイズは1920x1080ですが、関数内のプロセスが高速になるように、たとえば10x10にします。ビットマップのサイズや品質は気にせず、もっと速くしたいだけです。

この関数では、各ビットマップのヒストグラムを作成します。問題は、FORループに非常に時間がかかることです。

public static long[] GetHistogram(Bitmap b)
        {
            long[] myHistogram = new long[256]; // histogram סופר כמה יש מכל גוון

            BitmapData bmData = null;

            //b = new Bitmap(100, 100);
            //b.SetPixel(0,0,Color.FromArgb(10,30,40,50)); //run and make it come to here


            try
            {
                ResizeBitmap(b, 10, 10);
                //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]; //  p[0] - blue, p[1] - green , p[2]-red
                            Temp += p[1];
                            Temp += p[2];

                            Temp = (int)Temp / 3;
                            myHistogram[Temp]++;

                            //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
                {

                }
            }

            return myHistogram; // to save to a file the histogram of all the bitmaps/frames each line contain 0 to 256 values of a frame.
        }

したがって、この関数を呼び出すと、ResizeBitmap(b、10、10); そして、各ビットマップのサイズを変更してみてください。しかし、この行の後、ビットマップのサイズはまだ1920x1080であることがわかります。

これはResizeBitmap関数です:

public static Bitmap ResizeBitmap(Bitmap b, int nWidth, int nHeight)
        {
            Bitmap result = new Bitmap(nWidth, nHeight);
            using (Graphics g = Graphics.FromImage((Image)result))
                g.DrawImage(b, 0, 0, nWidth, nHeight);
            return result;
        }

たぶん、GetHistogram関数をより速く動作させる別の方法がありますか?

4

1 に答える 1

0

メソッドは新しいビットマップを返すため、戻り値を使用する必要があります。

Bitmap newBitmap = ResizeBitmap(b, 10, 10);
b.Dispose();
b = newBitmap;

補足: 画像のストライドを無視しています。つまり、ポインターが画像データの外に出る可能性があります。ビットマップが逆さまに格納されている場合、ストライドは負であると考えてください。

于 2012-10-30T16:31:49.530 に答える