Skip to content
This repository was archived by the owner on May 12, 2022. It is now read-only.

Commit 30db8c0

Browse files
author
Allester Fox
committed
Additional checks
RGB-444 support (Both way)
1 parent 7754e25 commit 30db8c0

1 file changed

Lines changed: 82 additions & 46 deletions

File tree

Image2Bitmap/Form1.cs

Lines changed: 82 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -16,21 +16,19 @@ public partial class Form1 : Form
1616
{
1717
enum TransformColorFormats
1818
{
19-
BW1BppH,
20-
BW1BppV,
19+
Mono_1bpp_H,
20+
Mono_1bpp_V,
2121
//BW8Bpp,
22-
RGB332,
23-
//RGB444,
24-
RGB565,
22+
RGB_332,
23+
RGB_444,
24+
RGB_565,
2525
}
26-
27-
private Image OriginalImage;
26+
2827
private BackgroundWorker bgWork;
2928

3029
public Form1()
3130
{
3231
InitializeComponent();
33-
btn_Convert.Enabled = false;
3432

3533
//selBox_Format.DataSource = Enum.GetValues(typeof(PixelFormat));
3634
selBox_Format.DataSource = Enum.GetValues(typeof(TransformColorFormats));
@@ -56,18 +54,16 @@ private void Btn_open_Click(object sender, EventArgs e)
5654
{
5755
try
5856
{
59-
OriginalImage = Image.FromStream(openFile.OpenFile());
60-
imageBox.Image = OriginalImage;
57+
imageBox.Image = Image.FromStream(openFile.OpenFile());
6158
txt_imgSize.Text = string.Format(
6259
"{0}\n{1}",
6360
openFile.SafeFileName,
64-
OriginalImage.PixelFormat.ToString()
61+
imageBox.Image.PixelFormat.ToString()
6562
);
66-
num_Width.Value = OriginalImage.Width;
67-
num_Height.Value = OriginalImage.Height;
63+
num_Width.Value = imageBox.Image.Width;
64+
num_Height.Value = imageBox.Image.Height;
6865

6966
tabBox.SelectedIndex = 0; // First tab (Image)
70-
btn_Convert.Enabled = true;
7167
}
7268
catch (Exception ex)
7369
{
@@ -154,15 +150,15 @@ private String CodeFromImage_1bpp(Image image, bool horisontal = false)
154150

155151
if (bitInBlock == 0)
156152
{
157-
result += "0x" + ColorByte.ToString("X2") + ", ";
158-
x_step++;
159153
if (x_step == 16)
160154
{
161155
x_step = 0;
162156
result += Environment.NewLine + "\t";
163157
}
158+
result += "0x" + ColorByte.ToString("X2") + ", ";
164159
ColorByte = 0;
165160
bitInBlock = 7;
161+
x_step++;
166162
}
167163
else
168164
bitInBlock--;
@@ -195,11 +191,12 @@ private string CodeFromImage(TransformColorFormats format)
195191

196192
switch (format)
197193
{
198-
case TransformColorFormats.RGB332:
194+
case TransformColorFormats.RGB_332:
199195
result.Append("uint8_t");
200196
codeFormat = "0x{0:x2}, ";
201197
break;
202-
case TransformColorFormats.RGB565:
198+
case TransformColorFormats.RGB_444:
199+
case TransformColorFormats.RGB_565:
203200
result.Append("uint16_t");
204201
codeFormat = "0x{0:x4}, ";
205202
break;
@@ -223,18 +220,26 @@ private string CodeFromImage(TransformColorFormats format)
223220

224221
switch (format)
225222
{
226-
case TransformColorFormats.RGB332:
223+
case TransformColorFormats.RGB_332:
227224
ColorByte =
228-
(pixelColor.R & 0xE0) |
225+
(pixelColor.R & 0xE0) | // 0xE0 = 1110 0000
229226
(pixelColor.G & 0xE0) >> 3 |
230-
(pixelColor.B & 0xC0) >> 6;
227+
(pixelColor.B & 0xC0) >> 6; // 0xC0 = 1100 0000
231228
break;
232-
case TransformColorFormats.RGB565:
229+
case TransformColorFormats.RGB_444:
233230
// byte = 16 bit per color
234231
// RRRR RGGG GGGB BBBB
235232
ColorByte =
236-
(pixelColor.R & 0xF8) << 8 |
237-
(pixelColor.G & 0xFC) << 3 |
233+
(pixelColor.R & 0xF0) << 4 | // 0xF0 = 1111 0000
234+
(pixelColor.G & 0xF0) |
235+
(pixelColor.B & 0xF0) >> 4;
236+
break;
237+
case TransformColorFormats.RGB_565:
238+
// byte = 16 bit per color
239+
// RRRR RGGG GGGB BBBB
240+
ColorByte =
241+
(pixelColor.R & 0xF8) << 8 | // 0xF8 = 1111 1000
242+
(pixelColor.G & 0xFC) << 3 | // 0xFC = 1111 1100
238243
(pixelColor.B & 0xF8) >> 3;
239244
break;
240245
}
@@ -264,27 +269,24 @@ private void ImageToCode(object sender, DoWorkEventArgs e)
264269
{
265270
switch (e.Argument)
266271
{
267-
case TransformColorFormats.BW1BppH:
268-
e.Result = CodeFromImage_1bpp(OriginalImage, true);
272+
case TransformColorFormats.Mono_1bpp_H:
273+
e.Result = CodeFromImage_1bpp(imageBox.Image, true);
269274
break;
270-
case TransformColorFormats.BW1BppV:
271-
e.Result = CodeFromImage_1bpp(OriginalImage, false);
275+
case TransformColorFormats.Mono_1bpp_V:
276+
e.Result = CodeFromImage_1bpp(imageBox.Image, false);
272277
break;
273-
case TransformColorFormats.RGB332:
274-
case TransformColorFormats.RGB565:
278+
case TransformColorFormats.RGB_332:
279+
case TransformColorFormats.RGB_444:
280+
case TransformColorFormats.RGB_565:
275281
e.Result = CodeFromImage((TransformColorFormats)e.Argument);
276-
//e.Result = GenDrawCode_RGB332(OriginalImage);
277282
break;
278-
//case TransformColorFormats.RGB565:
279-
//e.Result = GenDrawCode_RGB565(OriginalImage);
280-
//break;
281283
default:
282284
MessageBox.Show("Sorry, unsupported.");
283285
break;
284286
}
285287
}
286288

287-
#region Code2Image
289+
#region Code2Image
288290

289291
private void CodeToImage(object sender, DoWorkEventArgs e)
290292
{
@@ -300,6 +302,25 @@ private void CodeToImage(object sender, DoWorkEventArgs e)
300302
Code = GeneratedCode.Text;
301303
}));
302304

305+
if (Width <= 0 || Height <= 0)
306+
{
307+
MessageBox.Show("Error:\nThe size of image can't be zero!");
308+
return;
309+
}
310+
311+
// Some additional checks
312+
if (format == TransformColorFormats.Mono_1bpp_H && Width % 8 != 0)
313+
{
314+
MessageBox.Show("Error:\nWidth has to be multiple 8!");
315+
return;
316+
}
317+
318+
if (format == TransformColorFormats.Mono_1bpp_V && Height % 8 != 0)
319+
{
320+
MessageBox.Show("Error:\nHeight has to be multiple 8!");
321+
return;
322+
}
323+
303324
Bitmap result = new Bitmap(Width, Height);
304325

305326
int pixelsCurrent = 0;
@@ -312,40 +333,44 @@ private void CodeToImage(object sender, DoWorkEventArgs e)
312333
string regex = "";
313334
switch (format)
314335
{
315-
case TransformColorFormats.BW1BppH:
316-
case TransformColorFormats.BW1BppV:
317-
case TransformColorFormats.RGB332:
336+
case TransformColorFormats.Mono_1bpp_H:
337+
case TransformColorFormats.Mono_1bpp_V:
338+
case TransformColorFormats.RGB_332:
318339
regex = @"0x([0-9a-fA-F]{2}),"; // 0xAB (one byte)
319340
break;
320-
case TransformColorFormats.RGB565:
341+
case TransformColorFormats.RGB_444:
342+
case TransformColorFormats.RGB_565:
321343
regex = @"0x([0-9a-fA-F]{4}),"; // 0xABCD (two bytes)
322344
break;
323345
}
324-
346+
325347
foreach (Match m in Regex.Matches(Code, regex))
326348
{
327349
pixelColor = int.Parse(m.Groups[1].Value, System.Globalization.NumberStyles.HexNumber);
328350

329351
switch (format)
330352
{
331-
case TransformColorFormats.BW1BppH:
353+
case TransformColorFormats.Mono_1bpp_H:
332354
for (int offset = 7; offset >= 0; offset--)
333355
{
334356
result.SetPixel(x, y, ((pixelColor & (1 << offset)) > 0) ? Color.Black : Color.White);
335357
x++;
336358
}
337359
x--;
338360
break;
339-
case TransformColorFormats.BW1BppV:
361+
case TransformColorFormats.Mono_1bpp_V:
340362
for (int offset = 7; offset >= 0; offset--)
341363
{
342364
result.SetPixel(x, y + (-offset + 7), ((pixelColor & (1 << offset)) > 0) ? Color.Black : Color.White);
343365
}
344366
break;
345-
case TransformColorFormats.RGB332: // RRRG GGBB
367+
case TransformColorFormats.RGB_332: // RRRG GGBB
346368
result.SetPixel(x, y, color_from332(pixelColor));
347369
break;
348-
case TransformColorFormats.RGB565: // RRRR RGGG GGGB BBBB
370+
case TransformColorFormats.RGB_444: // 0000 RRRR GGGG BBBB
371+
result.SetPixel(x, y, color_from444(pixelColor));
372+
break;
373+
case TransformColorFormats.RGB_565: // RRRR RGGG GGGB BBBB
349374
result.SetPixel(x, y, color_from556(pixelColor));
350375
break;
351376
}
@@ -354,7 +379,7 @@ private void CodeToImage(object sender, DoWorkEventArgs e)
354379
if (x == Width)
355380
{
356381
x = 0;
357-
if (format == TransformColorFormats.BW1BppV)
382+
if (format == TransformColorFormats.Mono_1bpp_V)
358383
y += 8;
359384
else
360385
y += 1;
@@ -409,6 +434,12 @@ private void Btn_Convert_Click(object sender, EventArgs e)
409434
{
410435
default:
411436
case 0: // Image -> Code
437+
if (imageBox.Image.Width == 0 || imageBox.Image.Height == 0)
438+
{
439+
MessageBox.Show("Error!\nNo image loaded or unsupported image format.");
440+
btn_Convert.Enabled = true;
441+
return;
442+
}
412443
bgWork = new BackgroundWorker();
413444
bgWork.WorkerReportsProgress = true;
414445
bgWork.DoWork += new DoWorkEventHandler(ImageToCode);
@@ -417,13 +448,18 @@ private void Btn_Convert_Click(object sender, EventArgs e)
417448
bgWork.RunWorkerAsync(selBox_Format.SelectedItem);
418449
break;
419450
case 1: // Code -> Image
451+
if (string.IsNullOrWhiteSpace(GeneratedCode.Text))
452+
{
453+
MessageBox.Show("Error!\nEnter some code in Hex format (0x1234) devided by commas.");
454+
btn_Convert.Enabled = true;
455+
return;
456+
}
420457
bgWork = new BackgroundWorker();
421458
bgWork.WorkerReportsProgress = true;
422459
bgWork.DoWork += new DoWorkEventHandler(CodeToImage);
423460
bgWork.ProgressChanged += new ProgressChangedEventHandler(BgConvertProgress);
424461
bgWork.RunWorkerCompleted += new RunWorkerCompletedEventHandler(ConvertDone);
425462
bgWork.RunWorkerAsync(selBox_Format.SelectedItem);
426-
427463
break;
428464
}
429465

0 commit comments

Comments
 (0)