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)); }
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); }
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); }
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); }
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); }