예제 #1
0
        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);
                }
        }
예제 #2
0
        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);
                }
        }
예제 #3
0
        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);
                }
        }
예제 #4
0
        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()));
            }
        }