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;
86 public void MakeTransparent()
88 string sInFile = getInFile("bitmaps/maketransparent.bmp");
89 string sOutFile = getOutSubDir() + "transparent.bmp";
91 Bitmap bmp = new Bitmap(sInFile);
92 Console.WriteLine("Bitmap loaded OK", bmp != null);
94 bmp.MakeTransparent();
97 Color color = bmp.GetPixel(1,1);
98 AssertEquals (Color.Black.R, color.R);
99 AssertEquals (Color.Black.G, color.G);
100 AssertEquals (Color.Black.B, color.B);
106 string sInFile = getInFile ("bitmaps/almogaver24bits.bmp");
107 string sOutFile = getOutSubDir() + "clone24.bmp";
109 Rectangle rect = new Rectangle(0,0,50,50);
110 Bitmap bmp = new Bitmap(sInFile);
112 Bitmap bmpNew = bmp.Clone (rect, PixelFormat.Format32bppArgb);
114 Color colororg0 = bmp.GetPixel(0,0);
115 Color colororg50 = bmp.GetPixel(49,49);
116 Color colornew0 = bmpNew.GetPixel(0,0);
117 Color colornew50 = bmpNew.GetPixel(49,49);
119 AssertEquals (colororg0, colornew0);
120 AssertEquals (colororg50, colornew50);
124 public void CloneImage()
126 string sInFile = getInFile ("bitmaps/almogaver24bits.bmp");
127 Bitmap bmp = new Bitmap(sInFile);
129 Bitmap bmpNew = (Bitmap) bmp.Clone ();
131 AssertEquals (bmp.Width, bmpNew.Width);
132 AssertEquals (bmp.Height, bmpNew.Height);
133 AssertEquals (bmp.PixelFormat, bmpNew.PixelFormat);
140 string sInFile = getInFile ("bitmaps/almogaver24bits.bmp");
141 Bitmap bmp = new Bitmap(sInFile);
142 int cnt = bmp.GetFrameCount(FrameDimension.Page);
143 int active = bmp.SelectActiveFrame (FrameDimension.Page, 0);
145 AssertEquals (1, cnt);
146 AssertEquals (0, active);
149 static string ByteArrayToString(byte[] arrInput)
152 StringBuilder sOutput = new StringBuilder(arrInput.Length);
153 for (i=0;i < arrInput.Length -1; i++)
155 sOutput.Append(arrInput[i].ToString("X2"));
157 return sOutput.ToString();
161 public string RotateBmp (Bitmap src, RotateFlipType rotate)
163 int witdh = 150, height = 150, index = 0;
164 byte[] pixels = new byte [witdh * height * 3];
170 bmp_rotate = src.Clone (new RectangleF (0,0, witdh, height), PixelFormat.Format32bppArgb);
171 bmp_rotate.RotateFlip (rotate);
173 for (int y = 0; y < height; y++) {
174 for (int x = 0; x < witdh; x++) {
175 clr = bmp_rotate.GetPixel (x,y);
176 pixels[index++] = clr.R; pixels[index++] = clr.G; pixels[index++] = clr.B;
180 hash = new MD5CryptoServiceProvider().ComputeHash (pixels);
181 return ByteArrayToString (hash);
186 Rotate bitmap in diffent ways, and check the result
192 string sInFile = getInFile ("bitmaps/almogaver24bits.bmp");
193 Bitmap bmp = new Bitmap(sInFile);
195 AssertEquals ("312958A3C67402E1299413794988A3", RotateBmp (bmp, RotateFlipType.Rotate90FlipNone));
196 AssertEquals ("BF70D8DA4F1545AEDD77D0296B47AE", RotateBmp (bmp, RotateFlipType.Rotate180FlipNone));
197 AssertEquals ("15AD2ADBDC7090C0EC744D0F7ACE2F", RotateBmp (bmp, RotateFlipType.Rotate270FlipNone));
198 AssertEquals ("2E10FEC1F4FD64ECC51D7CE68AEB18", RotateBmp (bmp, RotateFlipType.RotateNoneFlipX));
199 AssertEquals ("E63204779B566ED01162B90B49BD9E", RotateBmp (bmp, RotateFlipType.Rotate90FlipX));
200 AssertEquals ("B1ECB17B5093E13D04FF55CFCF7763", RotateBmp (bmp, RotateFlipType.Rotate180FlipX));
201 AssertEquals ("71A173882C16755D86F4BC26532374", RotateBmp (bmp, RotateFlipType.Rotate270FlipX));
205 public void LockBmp (PixelFormat fmt, PixelFormat fmtlock, string output,
206 int lwidth , int lheight, ref string hash1, ref string hash2)
208 int width = 100, height = 100, bbps, cur, pos;
209 Bitmap bmp = new Bitmap (width, height, fmt);
210 Graphics gr = Graphics.FromImage (bmp);
213 byte[] btv = new byte[1];
214 int y, x, len = width * height * 4, index = 0;
215 byte[] pixels = new byte [len];
218 bbps = Image.GetPixelFormatSize (fmt);
220 Pen p = new Pen (Color.FromArgb (255, 100, 200, 250), 2);
221 gr.DrawRectangle(p, 1.0F, 1.0F, 80.0F, 80.0F);
223 BitmapData bd = bmp.LockBits (new Rectangle (0, 0, lwidth, lheight), ImageLockMode.ReadOnly, fmtlock);
225 pos = bd.Scan0.ToInt32();
226 for (y = 0; y < bd.Height; y++) {
227 for (x = 0; x < bd.Width; x++) {
230 for (int bt =0; bt < bbps/8; bt++, index++) {
235 Marshal.Copy ((IntPtr)cur, btv, 0, 1);
236 pixels[index] = btv[0];
238 /* Make change of all the colours = 250 to 10*/
241 Marshal.Copy (btv, 0, (IntPtr)cur, 1);
247 for (int i = index; i < len; i++)
250 hash = new MD5CryptoServiceProvider().ComputeHash (pixels);
253 hash1 = ByteArrayToString (hash);
255 /* MD5 of the changed bitmap*/
256 for (y = 0, index = 0; y < height; y++) {
257 for (x = 0; x < width; x++) {
258 clr = bmp.GetPixel (x,y);
259 pixels[index++] = clr.R; pixels[index++] = clr.G; pixels[index++] = clr.B;
263 hash = new MD5CryptoServiceProvider().ComputeHash (pixels);
264 hash2 = ByteArrayToString (hash);
266 /*bmp.Save (output, ImageFormat.Bmp);*/
269 Tests the LockBitmap functions. Makes a hash of the block of pixels that it returns
270 firsts, changes them, and then using GetPixel does another check of the changes.
271 The results match the .Net framework
274 public void LockBitmap ()
279 /* Locks the whole bitmap*/
280 LockBmp (PixelFormat.Format32bppArgb, PixelFormat.Format32bppArgb, "output32bppArgb.bmp", 100, 100, ref hash, ref hashchg);
281 AssertEquals ("AF5BFD4E98D6708FF4C9982CC9C68F", hash);
282 AssertEquals ("BBEE27DC85563CB58EE11E8951230F", hashchg);
284 LockBmp (PixelFormat.Format32bppPArgb, PixelFormat.Format32bppPArgb, "output32bppPArgb.bmp", 100, 100, ref hash, ref hashchg);
285 AssertEquals ("AF5BFD4E98D6708FF4C9982CC9C68F", hash);
286 AssertEquals ("BBEE27DC85563CB58EE11E8951230F", hashchg);
288 LockBmp (PixelFormat.Format32bppRgb, PixelFormat.Format32bppRgb, "output32bppRgb.bmp", 100, 100, ref hash, ref hashchg);
289 AssertEquals ("AF5BFD4E98D6708FF4C9982CC9C68F", hash);
290 AssertEquals ("BBEE27DC85563CB58EE11E8951230F", hashchg);
292 LockBmp (PixelFormat.Format24bppRgb, PixelFormat.Format24bppRgb, "output24bppRgb.bmp", 100, 100, ref hash, ref hashchg);
293 AssertEquals ("A8A071D0B3A3743905B4E193A62769", hash);
294 AssertEquals ("EEE846FA8F892339C64082DFF775CF", hashchg);
296 /* Locks a portion of the bitmap*/
297 LockBmp (PixelFormat.Format32bppArgb, PixelFormat.Format32bppArgb, "output32bppArgb.bmp", 50, 50, ref hash, ref hashchg);
298 AssertEquals ("C361FBFD82A4F3C278605AE9EC5385", hash);
299 AssertEquals ("8C2C04B361E1D5875EE8ACF5073F4E", hashchg);
301 LockBmp (PixelFormat.Format32bppPArgb, PixelFormat.Format32bppPArgb, "output32bppPArgb.bmp", 50, 50, ref hash, ref hashchg);
302 AssertEquals ("C361FBFD82A4F3C278605AE9EC5385", hash);
303 AssertEquals ("8C2C04B361E1D5875EE8ACF5073F4E", hashchg);
305 LockBmp (PixelFormat.Format32bppRgb, PixelFormat.Format32bppRgb, "output32bppRgb.bmp", 50, 50, ref hash, ref hashchg);
306 AssertEquals ("C361FBFD82A4F3C278605AE9EC5385", hash);
307 AssertEquals ("8C2C04B361E1D5875EE8ACF5073F4E", hashchg);
309 LockBmp (PixelFormat.Format24bppRgb, PixelFormat.Format24bppRgb, "output24bppRgb.bmp", 50, 50, ref hash, ref hashchg);
310 AssertEquals ("FFE86628478591D1A1EB30E894C34F", hash);
311 AssertEquals ("8C2C04B361E1D5875EE8ACF5073F4E", hashchg);