Guest User

Untitled

a guest
Sep 16th, 2015
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.45 KB | None | 0 0
  1. public unsafe class FastImage
  2.     {
  3.         private int width;
  4.         public int getWidth() { return width; }
  5.  
  6.         private int height;
  7.         public int getHeight() { return height; }
  8.  
  9.         private Bitmap bitmap;
  10.         private BitmapData bitmapData;
  11.         private int stride;
  12.         private byte* ptr;
  13.  
  14.         public static System.Drawing.Imaging.PixelFormat PIXEL_FORMAT = System.Drawing.Imaging.PixelFormat.Format32bppArgb;
  15.  
  16.         //Wenn ein neues Image erstellt werden soll
  17.         public FastImage(int width, int height)
  18.         {
  19.             this.width = width;
  20.             this.height = height;
  21.  
  22.             //Ein neues, leeres Bitmap generieren
  23.             bitmap = new Bitmap(width, height, PIXEL_FORMAT);
  24.  
  25.             bitmapData = bitmap.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PIXEL_FORMAT);
  26.             stride = bitmapData.Stride;
  27.         }
  28.  
  29.         //Wenn ein vorhandenes Bitmap verwendet werden soll
  30.         public FastImage(Bitmap bitmapNeu)
  31.         {
  32.             width = bitmapNeu.Width;
  33.             height = bitmapNeu.Height;
  34.  
  35.             //Das bitmapNeu kopieren, damit es das richtige PixelFormat besitzt
  36.             bitmap = new Bitmap(width, height, PIXEL_FORMAT);
  37.             using (Graphics gr = Graphics.FromImage(bitmap))
  38.             {
  39.                 gr.DrawImage(bitmapNeu, new Rectangle(0, 0, width, height));
  40.             }
  41.  
  42.             //Das bitmapNeu kann jetzt freigegeben werden
  43.             bitmapNeu.Dispose();
  44.  
  45.             bitmapData = bitmap.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PIXEL_FORMAT);
  46.             stride = bitmapData.Stride;
  47.             ptr = (byte*)bitmapData.Scan0;
  48.         }
  49.  
  50.         //Destructor
  51.         ~FastImage()
  52.         {
  53.             bitmap.UnlockBits(bitmapData);
  54.             bitmap.Dispose();
  55.         }
  56.  
  57.         public uint* getPixelPointer(int x, int y)
  58.         {
  59.             return (uint*)ptr[x + y * (stride / 4)];
  60.         }
  61.  
  62.         public void setPixelPointer(int x, int y, uint* pointer)
  63.         {
  64.             ptr[x + y * (stride / 4)] = (byte)pointer;
  65.         }
  66.  
  67.         public void setPixel(int x, int y, Color color)
  68.         {
  69.             ptr[(x * 3) + y * stride] = color.A;
  70.             ptr[(x * 3) + y * stride + 1] = color.B;
  71.             ptr[(x * 3) + y * stride + 2] = color.G;
  72.             ptr[(x * 3) + y * stride + 3] = color.R;
  73.         }
  74.  
  75.         public Color getPixel(int x, int y)
  76.         {
  77.             Byte a = ptr[(x * 3) + y * stride];
  78.             Byte b = ptr[(x * 3) + y * stride + 1];
  79.             Byte g = ptr[(x * 3) + y * stride + 2];
  80.             Byte r = ptr[(x * 3) + y * stride + 3];
  81.  
  82.             Color color = Color.FromArgb(a, r, g, b);
  83.             return color;
  84.         }
  85.  
  86.         public Bitmap getBitmap()
  87.         {
  88.             //Das bitmap vorrübergehend freistellen
  89.             bitmap.UnlockBits(bitmapData);
  90.  
  91.             Bitmap bitmapNeu = new Bitmap(width, height, PIXEL_FORMAT);
  92.             using (Graphics gr = Graphics.FromImage(bitmapNeu))
  93.             {
  94.                 gr.DrawImage(bitmap, new Rectangle(0, 0, width, height));
  95.             }
  96.  
  97.             //Das bitmap wieder laden
  98.             bitmapData = bitmap.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PIXEL_FORMAT);
  99.             ptr = (byte*)bitmapData.Scan0;
  100.  
  101.  
  102.             //Das kopierte neue Bitmap kann jetzt zurückgegeben werden
  103.             return bitmapNeu;
  104.         }
Advertisement
Add Comment
Please, Sign In to add comment