public void TestFrequencyImg() { var rng = new UniformRNG(0); int[] bucket = new int[100]; const int xExtent = 100; const int yExtent = 200; using (var file = File.OpenWrite(Path.Combine(RootDir, "rng_frequency.bmp"))) using (var image = new Image <SixLabors.ImageSharp.PixelFormats.Rgb24>(xExtent, yExtent)) { for (int i = 0; i < 10000; ++i) { bucket[rng.Uniform(0, xExtent)]++; } for (int i = 0; i < xExtent; ++i) { for (int j = 0; j < bucket[i]; ++j) { image[i, yExtent - j - 1] = new SixLabors.ImageSharp.PixelFormats.Rgb24(0xFF, 0x69, 0xB4); } } image.SaveAsBmp(file); } }
public void TestIntNoiseImg() { var rng = new UniformRNG(0); const int xExtent = 100; const int yExtent = 100; using (var file = File.OpenWrite(Path.Combine(RootDir, "rng_int_noise.bmp"))) using (var image = new Image <SixLabors.ImageSharp.PixelFormats.Rgb24>(xExtent, yExtent)) { for (int i = 0; i < xExtent; ++i) { for (int j = 0; j < yExtent; ++j) { var color = (byte)rng.Uniform(0, 255); image[i, j] = new SixLabors.ImageSharp.PixelFormats.Rgb24(color, color, color); } } image.SaveAsBmp(file); } }
public void TestOctavedPerlinNoise3D() { const int xExtent = 100; const int yExtent = 100; using (var file = File.OpenWrite(Path.Combine(RootDir, "OctavedPerlinNoise3D.bmp"))) using (var image = new Image <SixLabors.ImageSharp.PixelFormats.Rgb24>(xExtent, yExtent)) { var noise = new OctavedNoise <PerlinNoise>(new PerlinNoise(100), 8, 0.25f); var noiseValue = new float[xExtent, yExtent, 1]; noise.Noise(noiseValue, new Vector3(-10, 10, -10), new Vector3(0.1f, 0.1f, 0)); for (int x = 0; x < xExtent; x++) { for (int y = 0; y < yExtent; y++) { var color = (byte)(noiseValue[x, y, 0] * 255); image[x, y] = new SixLabors.ImageSharp.PixelFormats.Rgb24(color, color, color); } } image.SaveAsBmp(file); } }
public void UpdateFromImage(SixLabors.ImageSharp.PixelFormats.Rgb24 averageColor, MemoryStream image, int width, int height) { try { if ((DateTime.UtcNow - _lastChangeTime).TotalMilliseconds < _frameTimeSpan.TotalMilliseconds) { return; } var start = DateTime.UtcNow; var red = _config.Model.rgbDeviceSettings.keyboardResReduce; foreach (var device in _surface.Devices.Where(x => x.DeviceInfo.DeviceType == RGBDeviceType.Keyboard)) { //I am sampling the image by half the given dimensions because the rgb.net layouts width/height are not physical key dimensions and I dont need the extra accuracy here. // It is better to reduce the footprint created by doing this to try and help the gc. var newWidth = (int)Math.Floor(device.Size.Width / red); var newHeight = (int)Math.Floor(device.Size.Height / red); if (_imageByteStream == null) { _imageByteStream = new MemoryStream(newWidth * newHeight * 3); } _imageByteStream.Seek(0, SeekOrigin.Begin); var resizeImage = ImageHandler.ResizeImage(image, width, height, _imageByteStream, newWidth, newHeight, pixelFormat: PixelFormat.Rgb24); int count = 0; var sampleX = 0; var sampleY = 0; var pixIndex = 0; var stride = newWidth * 3; var r = 0; var g = 0; var b = 0; //Get the colors for the whole size of the key so we can average the whole key instead of just sampling its center. foreach (var key in device) { _colors[0] = 0; _colors[1] = 0; _colors[2] = 0; count = 0; for (var y = 0; y < key.Size.Height / red; ++y) { for (var x = 0; x < key.Size.Width / red; ++x) { sampleX = (int)Math.Floor(key.Location.X / red + x); sampleY = (int)Math.Floor(key.Location.Y / red + y); pixIndex = (sampleY * stride) + sampleX * 3; _imageByteStream.Seek(pixIndex, SeekOrigin.Begin); _colors[0] += _imageByteStream.ReadByte(); _colors[1] += _imageByteStream.ReadByte(); _colors[2] += _imageByteStream.ReadByte(); count++; } } r = (int)Math.Floor((_colors[0] / count) * _config.Model.rgbDeviceSettings.colorMultiplier); g = (int)Math.Floor((_colors[1] / count) * _config.Model.rgbDeviceSettings.colorMultiplier); b = (int)Math.Floor((_colors[2] / count) * _config.Model.rgbDeviceSettings.colorMultiplier); var lastColorR = key.Color.R * 255; var lastColorG = key.Color.G * 255; var lastColorB = key.Color.B * 255; //Only set the key color if it has changed enough. //This is to hopefully slow down the amount of allocations needed for the RGB.Net Color. if (!(lastColorR >= r - _colorChangeThreshold && lastColorR <= r + _colorChangeThreshold && lastColorG >= g - _colorChangeThreshold && lastColorG <= g + _colorChangeThreshold && lastColorB >= b - _colorChangeThreshold && lastColorB <= b + _colorChangeThreshold)) { key.Color = new Color(Math.Clamp(r, 0, 255), Math.Clamp(g, 0, 255), Math.Clamp(b, 0, 255)); } } } foreach (var device in _surface.Devices.Where(x => x.DeviceInfo.DeviceType == RGBDeviceType.Mouse || x.DeviceInfo.DeviceType == RGBDeviceType.Mainboard)) { var color = new Color(averageColor.R, averageColor.G, averageColor.B); foreach (var led in device) { led.Color = color; } } //Console.WriteLine($"Keyboard calc time: {(DateTime.UtcNow - start).TotalMilliseconds}"); _surface.Update(); _lastChangeTime = DateTime.UtcNow; } catch (Exception ex) { _ = Task.Run(() => _logger?.WriteLog(ex?.ToString())); } }