mirror of
https://github.com/kwsch/PKHeX
synced 2024-11-24 04:53:08 +00:00
9864d84704
Reduce memory usage for evo method banlist (static banlist references) Fix gen6 mega evo flag truncation simplify QR encode/decode logic a little Don't apply transparency if transparency is already 100% (skip the loop) Add gen5 wild pid/tid-sid correlation check Fix validation value reset (loading gen3-4 pkm without looking at met tab causes the met location to get reset); fixed by prematurely validating before setting the value Fix gen3 pkm with gen4 contest ribbons in gen4/5 getting flagged incorrectly
111 lines
3.7 KiB
C#
111 lines
3.7 KiB
C#
using System;
|
|
using System.Drawing;
|
|
using System.Drawing.Imaging;
|
|
using System.Runtime.InteropServices;
|
|
|
|
namespace PKHeX.WinForms
|
|
{
|
|
public static class ImageUtil
|
|
{
|
|
// Image Layering/Blending Utility
|
|
public static Bitmap LayerImage(Image baseLayer, Image overLayer, int x, int y, double trans)
|
|
{
|
|
if (baseLayer == null)
|
|
return overLayer as Bitmap;
|
|
Bitmap img = new Bitmap(baseLayer.Width, baseLayer.Height);
|
|
using (Graphics gr = Graphics.FromImage(img))
|
|
{
|
|
gr.DrawImage(baseLayer, new Point(0, 0));
|
|
Image o = trans == 1f ? overLayer : ChangeOpacity(overLayer, trans);
|
|
gr.DrawImage(o, new Rectangle(x, y, overLayer.Width, overLayer.Height));
|
|
}
|
|
return img;
|
|
}
|
|
public static Bitmap ChangeOpacity(Image img, double trans)
|
|
{
|
|
if (img == null)
|
|
return null;
|
|
if (img.PixelFormat.HasFlag(PixelFormat.Indexed))
|
|
return (Bitmap)img;
|
|
|
|
Bitmap bmp = (Bitmap)img.Clone();
|
|
BitmapData bmpData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
|
|
IntPtr ptr = bmpData.Scan0;
|
|
|
|
int len = bmp.Width * bmp.Height * 4;
|
|
byte[] data = new byte[len];
|
|
|
|
Marshal.Copy(ptr, data, 0, len);
|
|
|
|
for (int i = 0; i < data.Length; i += 4)
|
|
data[i + 3] = (byte)(data[i + 3] * trans);
|
|
|
|
Marshal.Copy(data, 0, ptr, len);
|
|
bmp.UnlockBits(bmpData);
|
|
|
|
return bmp;
|
|
}
|
|
public static Bitmap ChangeAllColorTo(Image img, Color c)
|
|
{
|
|
if (img == null)
|
|
return null;
|
|
if (img.PixelFormat.HasFlag(PixelFormat.Indexed))
|
|
return (Bitmap)img;
|
|
|
|
Bitmap bmp = (Bitmap)img.Clone();
|
|
BitmapData bmpData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
|
|
IntPtr ptr = bmpData.Scan0;
|
|
|
|
int len = bmp.Width * bmp.Height * 4;
|
|
byte[] data = new byte[len];
|
|
|
|
Marshal.Copy(ptr, data, 0, len);
|
|
|
|
byte R = c.R;
|
|
byte G = c.G;
|
|
byte B = c.B;
|
|
for (int i = 0; i < data.Length; i += 4)
|
|
if (data[i + 3] != 0)
|
|
{
|
|
data[i + 0] = B;
|
|
data[i + 1] = G;
|
|
data[i + 2] = R;
|
|
}
|
|
|
|
Marshal.Copy(data, 0, ptr, len);
|
|
bmp.UnlockBits(bmpData);
|
|
|
|
return bmp;
|
|
}
|
|
public static Bitmap ToGrayscale(Image img)
|
|
{
|
|
if (img == null)
|
|
return null;
|
|
if (img.PixelFormat.HasFlag(PixelFormat.Indexed))
|
|
return (Bitmap)img;
|
|
|
|
Bitmap bmp = (Bitmap)img.Clone();
|
|
BitmapData bmpData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
|
|
IntPtr ptr = bmpData.Scan0;
|
|
|
|
int len = bmp.Width * bmp.Height * 4;
|
|
byte[] data = new byte[len];
|
|
|
|
Marshal.Copy(ptr, data, 0, len);
|
|
|
|
for (int i = 0; i < data.Length; i += 4)
|
|
if (data[i + 3] != 0)
|
|
{
|
|
byte greyS = (byte)((0.3 * data[i + 2] + 0.59 * data[i + 1] + 0.11 * data[i + 0]) / 3);
|
|
data[i + 0] = greyS;
|
|
data[i + 1] = greyS;
|
|
data[i + 2] = greyS;
|
|
}
|
|
|
|
Marshal.Copy(data, 0, ptr, len);
|
|
bmp.UnlockBits(bmpData);
|
|
|
|
return bmp;
|
|
}
|
|
}
|
|
}
|