mirror of
https://github.com/Artemis-RGB/Artemis
synced 2025-12-13 05:48:35 +00:00
Upgraded bitmap resize method
This commit is contained in:
parent
37d4b31247
commit
b7c48b7c9b
@ -259,6 +259,7 @@
|
|||||||
<Compile Include="Utilities\ColorHelpers.cs" />
|
<Compile Include="Utilities\ColorHelpers.cs" />
|
||||||
<Compile Include="Utilities\GameState\GameDataReceivedEventArgs.cs" />
|
<Compile Include="Utilities\GameState\GameDataReceivedEventArgs.cs" />
|
||||||
<Compile Include="Utilities\GameState\GameStateWebServer.cs" />
|
<Compile Include="Utilities\GameState\GameStateWebServer.cs" />
|
||||||
|
<Compile Include="Utilities\ImageUtilities.cs" />
|
||||||
<Compile Include="Utilities\Memory\Memory.cs" />
|
<Compile Include="Utilities\Memory\Memory.cs" />
|
||||||
<Compile Include="Utilities\Memory\MemoryHelpers.cs" />
|
<Compile Include="Utilities\Memory\MemoryHelpers.cs" />
|
||||||
<Compile Include="Utilities\Memory\Win32.cs" />
|
<Compile Include="Utilities\Memory\Win32.cs" />
|
||||||
|
|||||||
@ -1,10 +1,7 @@
|
|||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
using CUE.NET;
|
using CUE.NET;
|
||||||
using CUE.NET.Devices.Generic.Enums;
|
|
||||||
using CUE.NET.Devices.Keyboard;
|
using CUE.NET.Devices.Keyboard;
|
||||||
using CUE.NET.Brushes;
|
using Artemis.Utilities;
|
||||||
using CUE.NET.Devices.Keyboard.Keys;
|
|
||||||
using System;
|
|
||||||
|
|
||||||
namespace Artemis.KeyboardProviders.Corsair
|
namespace Artemis.KeyboardProviders.Corsair
|
||||||
{
|
{
|
||||||
@ -47,17 +44,16 @@ namespace Artemis.KeyboardProviders.Corsair
|
|||||||
public override void DrawBitmap(Bitmap bitmap)
|
public override void DrawBitmap(Bitmap bitmap)
|
||||||
{
|
{
|
||||||
//bitmap = new Bitmap(@"C:\Users\Hazard\Desktop\1920x1080.png");
|
//bitmap = new Bitmap(@"C:\Users\Hazard\Desktop\1920x1080.png");
|
||||||
Bitmap resize = new Bitmap(bitmap, new Size((int)_keyboard.KeyboardRectangle.Width, (int)_keyboard.KeyboardRectangle.Height));
|
using (
|
||||||
|
var resized = ImageUtilities.ResizeImage(bitmap, (int)_keyboard.KeyboardRectangle.Width,
|
||||||
|
(int)_keyboard.KeyboardRectangle.Height))
|
||||||
|
{
|
||||||
foreach (var item in _keyboard.Keys)
|
foreach (var item in _keyboard.Keys)
|
||||||
{
|
{
|
||||||
Color pixelColor = resize.GetPixel((int)item.KeyRectangle.X, (int)item.KeyRectangle.Y);
|
item.Led.Color = resized.GetPixel((int)item.KeyRectangle.X, (int)item.KeyRectangle.Y);
|
||||||
if (pixelColor.Name == "0")
|
|
||||||
{
|
|
||||||
pixelColor = Color.Black;
|
|
||||||
}
|
}
|
||||||
item.Led.Color = pixelColor;
|
|
||||||
}
|
}
|
||||||
_keyboard.Update();
|
_keyboard.Update(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
135
Artemis/Artemis/Utilities/ImageUtilities.cs
Normal file
135
Artemis/Artemis/Utilities/ImageUtilities.cs
Normal file
@ -0,0 +1,135 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Drawing;
|
||||||
|
using System.Drawing.Imaging;
|
||||||
|
|
||||||
|
|
||||||
|
namespace Artemis.Utilities
|
||||||
|
{
|
||||||
|
class ImageUtilities
|
||||||
|
{
|
||||||
|
private static Dictionary<string, ImageCodecInfo> encoders = null;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// A lock to prevent concurrency issues loading the encoders.
|
||||||
|
/// </summary>
|
||||||
|
private static object encodersLock = new object();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// A quick lookup for getting image encoders
|
||||||
|
/// </summary>
|
||||||
|
public static Dictionary<string, ImageCodecInfo> Encoders
|
||||||
|
{
|
||||||
|
//get accessor that creates the dictionary on demand
|
||||||
|
get
|
||||||
|
{
|
||||||
|
//if the quick lookup isn't initialised, initialise it
|
||||||
|
if (encoders == null)
|
||||||
|
{
|
||||||
|
//protect against concurrency issues
|
||||||
|
lock (encodersLock)
|
||||||
|
{
|
||||||
|
//check again, we might not have been the first person to acquire the lock (see the double checked lock pattern)
|
||||||
|
if (encoders == null)
|
||||||
|
{
|
||||||
|
encoders = new Dictionary<string, ImageCodecInfo>();
|
||||||
|
|
||||||
|
//get all the codecs
|
||||||
|
foreach (ImageCodecInfo codec in ImageCodecInfo.GetImageEncoders())
|
||||||
|
{
|
||||||
|
//add each codec to the quick lookup
|
||||||
|
encoders.Add(codec.MimeType.ToLower(), codec);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//return the lookup
|
||||||
|
return encoders;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Resize the image to the specified width and height.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="image">The image to resize.</param>
|
||||||
|
/// <param name="width">The width to resize to.</param>
|
||||||
|
/// <param name="height">The height to resize to.</param>
|
||||||
|
/// <returns>The resized image.</returns>
|
||||||
|
public static Bitmap ResizeImage(Image image, int width, int height)
|
||||||
|
{
|
||||||
|
//a holder for the result
|
||||||
|
Bitmap result = new Bitmap(width, height);
|
||||||
|
//set the resolutions the same to avoid cropping due to resolution differences
|
||||||
|
result.SetResolution(image.HorizontalResolution, image.VerticalResolution);
|
||||||
|
|
||||||
|
//use a graphics object to draw the resized image into the bitmap
|
||||||
|
using (Graphics graphics = Graphics.FromImage(result))
|
||||||
|
{
|
||||||
|
//set the resize quality modes to high quality
|
||||||
|
graphics.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
|
||||||
|
graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
|
||||||
|
graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
|
||||||
|
//draw the image into the target bitmap
|
||||||
|
graphics.DrawImage(image, 0, 0, result.Width, result.Height);
|
||||||
|
}
|
||||||
|
|
||||||
|
//return the resulting bitmap
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Saves an image as a jpeg image, with the given quality
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="path">Path to which the image would be saved.</param>
|
||||||
|
/// <param name="quality">An integer from 0 to 100, with 100 being the
|
||||||
|
/// highest quality</param>
|
||||||
|
/// <exception cref="ArgumentOutOfRangeException">
|
||||||
|
/// An invalid value was entered for image quality.
|
||||||
|
/// </exception>
|
||||||
|
public static void SaveJpeg(string path, Image image, int quality)
|
||||||
|
{
|
||||||
|
//ensure the quality is within the correct range
|
||||||
|
if ((quality < 0) || (quality > 100))
|
||||||
|
{
|
||||||
|
//create the error message
|
||||||
|
string error = string.Format("Jpeg image quality must be between 0 and 100, with 100 being the highest quality. A value of {0} was specified.", quality);
|
||||||
|
//throw a helpful exception
|
||||||
|
throw new ArgumentOutOfRangeException(error);
|
||||||
|
}
|
||||||
|
|
||||||
|
//create an encoder parameter for the image quality
|
||||||
|
EncoderParameter qualityParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality);
|
||||||
|
//get the jpeg codec
|
||||||
|
ImageCodecInfo jpegCodec = GetEncoderInfo("image/jpeg");
|
||||||
|
|
||||||
|
//create a collection of all parameters that we will pass to the encoder
|
||||||
|
EncoderParameters encoderParams = new EncoderParameters(1);
|
||||||
|
//set the quality parameter for the codec
|
||||||
|
encoderParams.Param[0] = qualityParam;
|
||||||
|
//save the image using the codec and the parameters
|
||||||
|
image.Save(path, jpegCodec, encoderParams);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Returns the image codec with the given mime type
|
||||||
|
/// </summary>
|
||||||
|
public static ImageCodecInfo GetEncoderInfo(string mimeType)
|
||||||
|
{
|
||||||
|
//do a case insensitive search for the mime type
|
||||||
|
string lookupKey = mimeType.ToLower();
|
||||||
|
|
||||||
|
//the codec to return, default to null
|
||||||
|
ImageCodecInfo foundCodec = null;
|
||||||
|
|
||||||
|
//if we have the encoder, get it to return
|
||||||
|
if (Encoders.ContainsKey(lookupKey))
|
||||||
|
{
|
||||||
|
//pull the codec from the lookup
|
||||||
|
foundCodec = Encoders[lookupKey];
|
||||||
|
}
|
||||||
|
|
||||||
|
return foundCodec;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user