Skip to content

Commit cae9345

Browse files
committed
Fix Format24bppRgb image not being process correctly.
Maybe I'll add an option for users to use different color depth later on. For now I'll just cast everything into 8-bit mode. Signed-off-by: net2cn <mcopener@gmail.com>
1 parent 1fa8338 commit cae9345

File tree

2 files changed

+33
-8
lines changed

2 files changed

+33
-8
lines changed

Real-ESRGAN_GUI/ImageProcess.cs

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,9 @@ public static Bitmap ResizeBitmap(Bitmap image, int width, int height)
3434
return destImage;
3535
}
3636

37-
public static Bitmap ConvertBitmapToFormat32bppArgb(Bitmap bitmap)
37+
public static Bitmap ConvertBitmapToFormat(Bitmap bitmap, PixelFormat format)
3838
{
39-
Bitmap target = new Bitmap(bitmap.Width, bitmap.Height, PixelFormat.Format32bppArgb);
39+
Bitmap target = new Bitmap(bitmap.Width, bitmap.Height, format);
4040
target.SetResolution(bitmap.HorizontalResolution, bitmap.VerticalResolution); // Set both bitmap to same dpi to prevent scaling.
4141
using (Graphics g = Graphics.FromImage(target))
4242
{
@@ -46,8 +46,18 @@ public static Bitmap ConvertBitmapToFormat32bppArgb(Bitmap bitmap)
4646
return target;
4747
}
4848

49+
/// <summary>
50+
/// Split Format32bppArgb bitmap into two Format24bppRgb bitmap, one contains the RGB channels and one contains the alpha channel in the B channel.
51+
/// </summary>
52+
/// <param name="input">Format32bppArgb bitmap</param>
53+
/// <param name="rgb">Format24bppRgb bitmap containing RGB channels.</param>
54+
/// <param name="alpha">Format24bppRgb bitmap containint alpha channel of the original image in the B channel.</param>
4955
public static void SplitChannel(Bitmap input, out Bitmap rgb, out Bitmap alpha)
5056
{
57+
if (input.PixelFormat != PixelFormat.Format32bppArgb)
58+
{
59+
throw new FormatException();
60+
}
5161
rgb = new Bitmap(input.Width, input.Height, PixelFormat.Format24bppRgb);
5262
alpha = new Bitmap(input.Width, input.Height, PixelFormat.Format24bppRgb);
5363
var inputData = input.LockBits(new Rectangle(0, 0, input.Width, input.Height), ImageLockMode.ReadOnly, input.PixelFormat);
@@ -78,8 +88,18 @@ public static void SplitChannel(Bitmap input, out Bitmap rgb, out Bitmap alpha)
7888
}
7989
}
8090

91+
/// <summary>
92+
/// Combine RGB image and alpha image as one ARGB image.
93+
/// </summary>
94+
/// <param name="rgb">Format24bppRgb bitmap containing the RGB channels.</param>
95+
/// <param name="alpha">Format24bppRgb bitmap containng the alpha channels in the B channel.</param>
96+
/// <returns></returns>
8197
public static Bitmap CombineChannel(Bitmap rgb, Bitmap alpha)
8298
{
99+
if (rgb.PixelFormat!=PixelFormat.Format24bppRgb || alpha.PixelFormat != PixelFormat.Format24bppRgb)
100+
{
101+
throw new FormatException();
102+
}
83103
var output = new Bitmap(rgb.Width, rgb.Height, PixelFormat.Format32bppArgb);
84104
var outputData = output.LockBits(new Rectangle(0, 0, output.Width, output.Height), ImageLockMode.WriteOnly, output.PixelFormat);
85105
var rgbData = rgb.LockBits(new Rectangle(0, 0, rgb.Width, rgb.Height), ImageLockMode.ReadOnly, rgb.PixelFormat);

Real-ESRGAN_GUI/Model.cs

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -58,18 +58,23 @@ public async Task Scale(string baseInputPath, List<string> inputPaths, string ou
5858
{
5959
Bitmap image = new Bitmap(inputPath);
6060
var originalPixelFormat = image.PixelFormat;
61-
if (image.PixelFormat != PixelFormat.Format32bppArgb)
62-
{
63-
Bitmap alphaImage;
64-
image = ImageProcess.ConvertBitmapToFormat32bppArgb(image);
65-
}
66-
//TODO: Add Alpha channel inference.
61+
6762
Bitmap alpha=null;
6863
if (preserveAlpha && originalPixelFormat!=PixelFormat.Format24bppRgb)
6964
{
65+
if (image.PixelFormat != PixelFormat.Format32bppArgb)
66+
{
67+
image = ImageProcess.ConvertBitmapToFormat(image, PixelFormat.Format32bppArgb);
68+
}
7069
ImageProcess.SplitChannel(image, out image, out alpha);
7170
}
7271

72+
// Ensure that we got RGB channels in Format24bppRgb bitmap.
73+
if (image.PixelFormat != PixelFormat.Format24bppRgb)
74+
{
75+
image = ImageProcess.ConvertBitmapToFormat(image, PixelFormat.Format24bppRgb);
76+
}
77+
7378
logger.Log("Creating input image...");
7479
var inMat = ConvertImageToFloatTensorUnsafe(image);
7580
logger.Progress += 10/count;

0 commit comments

Comments
 (0)