2 // Bitmap class testing unit
6 // Jordi Mas i Hernàndez (jmas@softcatala.org>
8 // (C) 2004 Ximian, Inc. http://www.ximian.com
12 using System.Drawing.Imaging;
13 using NUnit.Framework;
15 using System.Security.Cryptography;
17 using System.Runtime.InteropServices;
19 namespace MonoTests.System.Drawing{
22 public class TestBitmap : Assertion {
25 public void Clean() {}
28 public void GetReady()
34 public void TestPixels()
36 // Tests GetSetPixel/SetPixel
37 Bitmap bmp= new Bitmap(100,100, PixelFormat.Format32bppRgb);
38 bmp.SetPixel(0,0,Color.FromArgb(255,128,128,128));
39 Color color = bmp.GetPixel(0,0);
41 AssertEquals (Color.FromArgb(255,128,128,128), color);
43 bmp.SetPixel(99,99,Color.FromArgb(255,255,0,155));
44 Color color2 = bmp.GetPixel(99,99);
45 AssertEquals (Color.FromArgb(255,255,0,155), color2);
48 /* Get the output directory depending on the runtime and location*/
49 internal string getOutSubDir()
53 if (Environment.GetEnvironmentVariable("MSNet")==null)
58 sRslt = Path.GetFullPath (sSub);
60 if (Directory.Exists(sRslt) == false)
61 sRslt = "Test/System.Drawing/" + sSub;
64 if (sRslt[sRslt.Length-1] != '\\' && sRslt[sRslt.Length-1] != '/')
70 /* Get the input directory depending on the runtime*/
71 internal string getInFile(string file)
75 sRslt = Path.GetFullPath (file);
77 if (File.Exists(file)==false)
78 sRslt = "Test/System.Drawing/" + file;
84 public void BitmapLoadAndSave()
86 string sOutFile = getOutSubDir() + "linerect.bmp";
89 Bitmap bmp = new Bitmap(100,100, PixelFormat.Format32bppRgb);
90 Graphics gr = Graphics.FromImage(bmp);
92 Pen p = new Pen(Color.Red, 2);
93 gr.DrawLine(p, 10.0F, 10.0F, 90.0F, 90.0F);
94 gr.DrawRectangle(p, 10.0F, 10.0F, 80.0F, 80.0F);
96 bmp.Save(sOutFile, ImageFormat.Bmp);
101 Bitmap bmpLoad = new Bitmap(sOutFile);
103 Console.WriteLine("Unable to load "+ sOutFile);
105 Color color = bmpLoad.GetPixel(10,10);
108 AssertEquals (Color.FromArgb(255,255,0,0), color);
112 public void MakeTransparent()
114 string sInFile = getInFile("bitmaps/maketransparent.bmp");
115 string sOutFile = getOutSubDir() + "transparent.bmp";
117 Bitmap bmp = new Bitmap(sInFile);
118 Console.WriteLine("Bitmap loaded OK", bmp != null);
120 bmp.MakeTransparent();
123 Color color = bmp.GetPixel(1,1);
124 AssertEquals (Color.Black.R, color.R);
125 AssertEquals (Color.Black.G, color.G);
126 AssertEquals (Color.Black.B, color.B);
132 string sInFile = getInFile ("bitmaps/almogaver24bits.bmp");
133 string sOutFile = getOutSubDir() + "clone24.bmp";
135 Rectangle rect = new Rectangle(0,0,50,50);
136 Bitmap bmp = new Bitmap(sInFile);
138 Bitmap bmpNew = bmp.Clone (rect, PixelFormat.Format32bppArgb);
139 bmpNew.Save(sOutFile);
141 Color colororg0 = bmp.GetPixel(0,0);
142 Color colororg50 = bmp.GetPixel(49,49);
143 Color colornew0 = bmpNew.GetPixel(0,0);
144 Color colornew50 = bmpNew.GetPixel(49,49);
146 AssertEquals (colororg0, colornew0);
147 AssertEquals (colororg50, colornew50);
151 public void CloneImage()
153 string sInFile = getInFile ("bitmaps/almogaver24bits.bmp");
154 Bitmap bmp = new Bitmap(sInFile);
156 Bitmap bmpNew = (Bitmap) bmp.Clone ();
158 AssertEquals (bmp.Width, bmpNew.Width);
159 AssertEquals (bmp.Height, bmpNew.Height);
160 AssertEquals (bmp.PixelFormat, bmpNew.PixelFormat);
164 /* Check bitmap features on a know 24-bits bitmap*/
166 public void BitmapFeatures()
168 string sInFile = getInFile ("bitmaps/almogaver24bits.bmp");
169 Bitmap bmp = new Bitmap(sInFile);
171 GraphicsUnit unit = GraphicsUnit.World;
173 rect = bmp.GetBounds(ref unit);
175 AssertEquals (PixelFormat.Format24bppRgb, bmp.PixelFormat);
176 AssertEquals (173, bmp.Width);
177 AssertEquals (183, bmp.Height);
179 AssertEquals (0, rect.X);
180 AssertEquals (0, rect.Y);
181 AssertEquals (173, rect.Width);
182 AssertEquals (183, rect.Height);
184 AssertEquals (173, bmp.Size.Width);
185 AssertEquals (183, bmp.Size.Height);
191 string sInFile = getInFile ("bitmaps/almogaver24bits.bmp");
192 Bitmap bmp = new Bitmap(sInFile);
193 int cnt = bmp.GetFrameCount(FrameDimension.Page);
194 int active = bmp.SelectActiveFrame (FrameDimension.Page, 0);
196 AssertEquals (1, cnt);
197 AssertEquals (0, active);
200 static string ByteArrayToString(byte[] arrInput)
203 StringBuilder sOutput = new StringBuilder(arrInput.Length);
204 for (i=0;i < arrInput.Length -1; i++)
206 sOutput.Append(arrInput[i].ToString("X2"));
208 return sOutput.ToString();
212 public string RotateBmp (Bitmap src, RotateFlipType rotate)
214 int witdh = 150, height = 150, index = 0;
215 byte[] pixels = new byte [witdh * height * 3];
221 bmp_rotate = src.Clone (new RectangleF (0,0, witdh, height), PixelFormat.Format32bppArgb);
222 bmp_rotate.RotateFlip (rotate);
224 for (int y = 0; y < height; y++) {
225 for (int x = 0; x < witdh; x++) {
226 clr = bmp_rotate.GetPixel (x,y);
227 pixels[index++] = clr.R; pixels[index++] = clr.G; pixels[index++] = clr.B;
231 hash = new MD5CryptoServiceProvider().ComputeHash (pixels);
232 return ByteArrayToString (hash);
237 Rotate bitmap in diffent ways, and check the result
243 string sInFile = getInFile ("bitmaps/almogaver24bits.bmp");
244 Bitmap bmp = new Bitmap(sInFile);
246 AssertEquals ("312958A3C67402E1299413794988A3", RotateBmp (bmp, RotateFlipType.Rotate90FlipNone));
247 AssertEquals ("BF70D8DA4F1545AEDD77D0296B47AE", RotateBmp (bmp, RotateFlipType.Rotate180FlipNone));
248 AssertEquals ("15AD2ADBDC7090C0EC744D0F7ACE2F", RotateBmp (bmp, RotateFlipType.Rotate270FlipNone));
249 AssertEquals ("2E10FEC1F4FD64ECC51D7CE68AEB18", RotateBmp (bmp, RotateFlipType.RotateNoneFlipX));
250 AssertEquals ("E63204779B566ED01162B90B49BD9E", RotateBmp (bmp, RotateFlipType.Rotate90FlipX));
251 AssertEquals ("B1ECB17B5093E13D04FF55CFCF7763", RotateBmp (bmp, RotateFlipType.Rotate180FlipX));
252 AssertEquals ("71A173882C16755D86F4BC26532374", RotateBmp (bmp, RotateFlipType.Rotate270FlipX));
256 public void LockBmp (PixelFormat fmt, PixelFormat fmtlock, string output,
257 int lwidth , int lheight, ref string hash1, ref string hash2)
259 int width = 100, height = 100, bbps, cur, pos;
260 Bitmap bmp = new Bitmap (width, height, fmt);
261 Graphics gr = Graphics.FromImage (bmp);
264 byte[] btv = new byte[1];
265 int y, x, len = width * height * 4, index = 0;
266 byte[] pixels = new byte [len];
269 bbps = Image.GetPixelFormatSize (fmt);
271 Pen p = new Pen (Color.FromArgb (255, 100, 200, 250), 2);
272 gr.DrawRectangle(p, 1.0F, 1.0F, 80.0F, 80.0F);
274 BitmapData bd = bmp.LockBits (new Rectangle (0, 0, lwidth, lheight), ImageLockMode.ReadOnly, fmtlock);
276 pos = bd.Scan0.ToInt32();
277 for (y = 0; y < bd.Height; y++) {
278 for (x = 0; x < bd.Width; x++) {
281 for (int bt =0; bt < bbps/8; bt++, index++) {
286 Marshal.Copy ((IntPtr)cur, btv, 0, 1);
287 pixels[index] = btv[0];
289 /* Make change of all the colours = 250 to 10*/
292 Marshal.Copy (btv, 0, (IntPtr)cur, 1);
298 for (int i = index; i < len; i++)
301 hash = new MD5CryptoServiceProvider().ComputeHash (pixels);
304 hash1 = ByteArrayToString (hash);
306 /* MD5 of the changed bitmap*/
307 for (y = 0, index = 0; y < height; y++) {
308 for (x = 0; x < width; x++) {
309 clr = bmp.GetPixel (x,y);
310 pixels[index++] = clr.R; pixels[index++] = clr.G; pixels[index++] = clr.B;
314 hash = new MD5CryptoServiceProvider().ComputeHash (pixels);
315 hash2 = ByteArrayToString (hash);
317 /*bmp.Save (output, ImageFormat.Bmp);*/
320 Tests the LockBitmap functions. Makes a hash of the block of pixels that it returns
321 firsts, changes them, and then using GetPixel does another check of the changes.
322 The results match the .Net framework
325 public void LockBitmap ()
330 /* Locks the whole bitmap*/
331 LockBmp (PixelFormat.Format32bppArgb, PixelFormat.Format32bppArgb, "output32bppArgb.bmp", 100, 100, ref hash, ref hashchg);
332 AssertEquals ("AF5BFD4E98D6708FF4C9982CC9C68F", hash);
333 AssertEquals ("BBEE27DC85563CB58EE11E8951230F", hashchg);
335 LockBmp (PixelFormat.Format32bppPArgb, PixelFormat.Format32bppPArgb, "output32bppPArgb.bmp", 100, 100, ref hash, ref hashchg);
336 AssertEquals ("AF5BFD4E98D6708FF4C9982CC9C68F", hash);
337 AssertEquals ("BBEE27DC85563CB58EE11E8951230F", hashchg);
339 LockBmp (PixelFormat.Format32bppRgb, PixelFormat.Format32bppRgb, "output32bppRgb.bmp", 100, 100, ref hash, ref hashchg);
340 AssertEquals ("AF5BFD4E98D6708FF4C9982CC9C68F", hash);
341 AssertEquals ("BBEE27DC85563CB58EE11E8951230F", hashchg);
343 LockBmp (PixelFormat.Format24bppRgb, PixelFormat.Format24bppRgb, "output24bppRgb.bmp", 100, 100, ref hash, ref hashchg);
344 AssertEquals ("A8A071D0B3A3743905B4E193A62769", hash);
345 AssertEquals ("EEE846FA8F892339C64082DFF775CF", hashchg);
347 /* Locks a portion of the bitmap*/
348 LockBmp (PixelFormat.Format32bppArgb, PixelFormat.Format32bppArgb, "output32bppArgb.bmp", 50, 50, ref hash, ref hashchg);
349 AssertEquals ("C361FBFD82A4F3C278605AE9EC5385", hash);
350 AssertEquals ("8C2C04B361E1D5875EE8ACF5073F4E", hashchg);
352 LockBmp (PixelFormat.Format32bppPArgb, PixelFormat.Format32bppPArgb, "output32bppPArgb.bmp", 50, 50, ref hash, ref hashchg);
353 AssertEquals ("C361FBFD82A4F3C278605AE9EC5385", hash);
354 AssertEquals ("8C2C04B361E1D5875EE8ACF5073F4E", hashchg);
356 LockBmp (PixelFormat.Format32bppRgb, PixelFormat.Format32bppRgb, "output32bppRgb.bmp", 50, 50, ref hash, ref hashchg);
357 AssertEquals ("C361FBFD82A4F3C278605AE9EC5385", hash);
358 AssertEquals ("8C2C04B361E1D5875EE8ACF5073F4E", hashchg);
360 LockBmp (PixelFormat.Format24bppRgb, PixelFormat.Format24bppRgb, "output24bppRgb.bmp", 50, 50, ref hash, ref hashchg);
361 AssertEquals ("FFE86628478591D1A1EB30E894C34F", hash);
362 AssertEquals ("8C2C04B361E1D5875EE8ACF5073F4E", hashchg);