Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.IO;
- using System.Drawing;
- using System.Drawing.Imaging;
- namespace testsharp
- {
- class test12
- {
- static byte[] ImageToBytes(Bitmap bitmap)
- {
- byte[] data = new byte[bitmap.Width * bitmap.Height * 4];
- BitmapData bitmapData = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
- unsafe
- {
- for (int y = 0; y < bitmapData.Height; y++)
- {
- byte* row = (byte*)bitmapData.Scan0 + (y * bitmapData.Stride);
- for (int x = 0; x < bitmapData.Width; x++)
- {
- data[(y * bitmapData.Width + x) * 4 + 0] = row[x * 4 + 2]; //Internal R
- data[(y * bitmapData.Width + x) * 4 + 1] = row[x * 4 + 1]; //Internal G
- data[(y * bitmapData.Width + x) * 4 + 2] = row[x * 4 + 0]; //Internal B
- data[(y * bitmapData.Width + x) * 4 + 3] = row[x * 4 + 3]; //Internal A
- }
- }
- }
- bitmap.UnlockBits(bitmapData);
- return data;
- }
- static Bitmap BytesToImage(byte[] data, int width, int height)
- {
- Bitmap bitmap = new Bitmap(width, height);
- BitmapData bitmapData = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
- unsafe
- {
- for (int y = 0; y < bitmapData.Height; y++)
- {
- byte* row = (byte*)bitmapData.Scan0 + (y * bitmapData.Stride);
- for (int x = 0; x < bitmapData.Width; x++)
- {
- row[x * 4 + 0] = data[(y * bitmapData.Width + x) * 4 + 2]; //Internal B
- row[x * 4 + 1] = data[(y * bitmapData.Width + x) * 4 + 1]; //Internal G
- row[x * 4 + 2] = data[(y * bitmapData.Width + x) * 4 + 0]; //Internal R
- row[x * 4 + 3] = data[(y * bitmapData.Width + x) * 4 + 3]; //Internal A
- }
- }
- }
- bitmap.UnlockBits(bitmapData);
- return bitmap;
- }
- static byte AdjustBrightness(byte b, float factor)
- {
- return (byte)(Math.Pow((float)b / 255, factor) * 255); // gamma
- }
- static void FindImageDifferences(string pathIn1, string pathIn2, string pathOut)
- {
- Image img1 = Image.FromFile(pathIn1);
- Image img2 = Image.FromFile(pathIn2);
- if (img1.Width != img2.Width || img1.Height != img2.Height)
- return;
- byte[] data1 = ImageToBytes((Bitmap)img1);
- byte[] data2 = ImageToBytes((Bitmap)img2);
- byte[] data3 = new byte[data1.Length];
- for (int i = 0; i < data3.Length; i++)
- {
- int diff = Math.Abs(data1[i] - data2[i]);
- if (diff < 40)
- diff = 0;
- diff *= 20;
- int newValue = diff + AdjustBrightness(data1[i], 1.6f);
- if (newValue > 255)
- data3[i] = 255;
- else
- data3[i] = (byte)newValue;
- }
- Image imgOut = BytesToImage(data3, img1.Width, img1.Height);
- imgOut.Save(pathOut, ImageFormat.Png);
- img1.Dispose();
- img2.Dispose();
- imgOut.Dispose();
- }
- public static void Main()
- {
- string pathIn1 = @"e:\temp\i1.png";
- string pathIn2 = @"e:\temp\i2.png";
- string pathOut = @"e:\temp\out.png";
- FindImageDifferences(pathIn1, pathIn2, pathOut);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment