Beispiel #1
0
        private (byte a, byte r, byte g, byte b) PoolMean3(LockBitmap4Pointer bitmap, int startX, int xLength, int startY, int yLength)
        {
            var a     = 0;
            var r     = 0;
            var g     = 0;
            var b     = 0;
            var index = 0;

            for (var x = startX; x < startX + xLength && x < _width; x++)
            {
                for (var y = startY; y < startY + yLength && y < _height; y++)
                {
                    var color = bitmap.GetPixel(x, y);
                    a += color.A;
                    r += color.R;
                    g += color.G;
                    b += color.B;
                    index++;
                }
            }

            _valueSumOfColor[0] += a;
            _valueSumOfColor[1] += r;
            _valueSumOfColor[2] += g;
            _valueSumOfColor[3] += b;
            return((byte)(a / index), (byte)(r / index), (byte)(g / index), (byte)(b / index));
        }
Beispiel #2
0
        internal byte[,,] Execute(Bitmap bitmap, int compressionWidth, int compressionHeight, PoolingType poolingType)
        {
            _width  = bitmap.Width;
            _height = bitmap.Height;

            if (_width < compressionWidth)
            {
                return(null);
            }
            if (_height < compressionHeight)
            {
                return(null);
            }

            // 倍数
            var multipleX = _width / compressionWidth;
            var multipleY = _height / compressionHeight;
            var cWidth    = (int)Math.Ceiling(_width / (float)multipleX);
            var cHeight   = (int)Math.Ceiling(_height / (float)multipleY);
            var result    = new byte[cWidth, cHeight, 4];

            var lockbmp = new LockBitmap4Pointer(bitmap);

            lockbmp.LockBits();

            Parallel.For(0, cWidth, (cx) =>
            {
                //for (int cx = 0; cx < cWidth; cx++)
                //{
                Parallel.For(0, cHeight, (cy) =>
                {
                    //for (int cy = 0; cy < cHeight; cy++)
                    //{
                    (byte a, byte r, byte g, byte b)data;
                    if (poolingType == PoolingType.Mean)
                    {
                        data = PoolMean3(lockbmp, cx * multipleX, multipleX, cy * multipleY, multipleY);
                    }
                    else
                    {
                        data = PoolMax3(lockbmp, cx * multipleX, multipleX, cy * multipleY, multipleY);
                    }
                    result[cx, cy, 0] = data.a;
                    result[cx, cy, 1] = data.r;
                    result[cx, cy, 2] = data.g;
                    result[cx, cy, 3] = data.b;
                });
            });

            //从内存解锁Bitmap
            lockbmp.UnlockBits();

            return(result);
        }
Beispiel #3
0
        private float PoolMean(LockBitmap4Pointer bitmap, int startX, int xLength, int startY, int yLength)
        {
            var result = 0f;
            var index  = 0;

            for (var x = startX; x < startX + xLength && x < _width; x++)
            {
                for (var y = startY; y < startY + yLength && y < _height; y++)
                {
                    result += bitmap.GetPixel(x, y).ToArgb();//.GetBrightness();
                    index++;
                }
            }

            _valueSum += result;
            return(result / index);
        }
Beispiel #4
0
        private float PoolMax(LockBitmap4Pointer bitmap, int startX, int xLength, int startY, int yLength)
        {
            var result = 0f;

            for (var x = startX; x < startX + xLength && x < _width; x++)
            {
                for (var y = startY; y < startY + yLength && y < _height; y++)
                {
                    var light = Math.Abs(bitmap.GetPixel(x, y).ToArgb());//.GetBrightness();
                    if (result < light)
                    {
                        result = light;
                    }
                    _valueSum += light;
                }
            }

            return(result);
        }
Beispiel #5
0
        private (byte a, byte r, byte g, byte b) PoolMax3(LockBitmap4Pointer bitmap, int startX, int xLength, int startY, int yLength)
        {
            var a = 0;
            var r = 0;
            var g = 0;
            var b = 0;

            for (var x = startX; x < startX + xLength && x < _width; x++)
            {
                for (var y = startY; y < startY + yLength && y < _height; y++)
                {
                    var color = bitmap.GetPixel(x, y);
                    if (a < color.A)
                    {
                        a = color.A;
                    }
                    if (r < color.R)
                    {
                        r = color.R;
                    }
                    if (g < color.G)
                    {
                        g = color.G;
                    }
                    if (b < color.B)
                    {
                        b = color.B;
                    }
                    _valueSumOfColor[0] += color.A;
                    _valueSumOfColor[1] += color.R;
                    _valueSumOfColor[2] += color.G;
                    _valueSumOfColor[3] += color.B;
                }
            }

            return((byte)a, (byte)r, (byte)g, (byte)b);
        }