Advertisement
Gavreg

Байты

Mar 9th, 2021
944
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.68 KB | None | 0 0
  1. /*
  2. Суть более быстрой работы в том, что мы будет трогать напрямую байты изображения, без медленного посредника в лице Bitmap
  3. */
  4. using System.Drawing;
  5. using System.Drawing.Imaging;
  6. using System.Runtime.InteropServices;
  7.  
  8. class ananas
  9. {
  10.             //Допустим, пишем какуюто функцию обработки изображений.
  11.         public static Bitmap SomeFunction(Bitmap input)
  12.         {
  13.             int width = input.Width;
  14.             int height = input.Height;
  15.             //создаем временное изображние с нужным нам форматом хранения.
  16.             //так как обработка побайтовая, там важно расположение байтов в картинке.
  17.             //а оно опеределено форматом хранения
  18.  
  19.             byte[] input_bytes = new byte[0]; //пустой массивчик байт
  20.            
  21.             //по этому создадим новый битмап с нужным нам 3х байтовым форматом.
  22.             using (Bitmap _tmp = new Bitmap(width, height, PixelFormat.Format24bppRgb))
  23.             {
  24.                 //устанавливаем DPI такой же как у исходного
  25.                 _tmp.SetResolution(input.HorizontalResolution, input.VerticalResolution);
  26.  
  27.                 //рисуем исходное изображение на временном, "типо-копируем"
  28.                 using (var g = Graphics.FromImage(_tmp))
  29.                 {
  30.                     g.DrawImageUnscaled(input, 0, 0);  
  31.                 }
  32.                 input_bytes = getImgBytes(_tmp); //получаем байты изображения, см. описание ф-ции ниже
  33.  
  34.             }
  35.  
  36.             /*
  37.                 Вот на этом моменте у нам в массиве input_bytes лежит побайтовая копия исходной картинки.
  38.                 в формате BGR-BGR-BGR-BGR-BGR-BGR (обратите внимание, цвета хранятся наоборот)
  39.                
  40.                 Обработка картинки таким образом В РАЗЫ быстрее, чем через Bitmap                
  41.  
  42.              */
  43.  
  44.                    
  45.             //Допустим, мы обработаки картинку и сложили результат сюда:
  46.             byte[] bytes = new byte[width*height*3];
  47.  
  48.  
  49.  
  50.            //Теперь надо сложить новые байты в битмап,
  51.            //создаем выходное изображние (отбратите внимание, без using!!, иначе будет нечего возвращать)
  52.             Bitmap img_ret = new Bitmap(width, height, PixelFormat.Format24bppRgb);
  53.             img_ret.SetResolution(input.HorizontalResolution, input.VerticalResolution);
  54.  
  55.             writeImageBytes(img_ret, bytes);
  56.  
  57.             return img_ret;
  58.         }
  59.         //по хорошему, написанную фунцкцию надо вызывать так
  60.         /*
  61.             using (var b = SomeFunction(...)   вот он, потерянный using.
  62.             {
  63.                     ...
  64.             }
  65.            
  66.          */
  67.        
  68.         static byte[] getImgBytes(Bitmap img)
  69.         {
  70.             byte[] bytes = new byte[img.Width * img.Height * 3];  //выделяем память под массив байтов
  71.             var data = img.LockBits(new Rectangle(0, 0, img.Width, img.Height),  //блокируем участок памати, занимаемый изображением
  72.                 ImageLockMode.ReadOnly,
  73.                 img.PixelFormat);
  74.             Marshal.Copy(data.Scan0, bytes, 0, bytes.Length);  //копируем байты изображения в массив
  75.             img.UnlockBits(data);   //разблокируем изображение
  76.             return bytes; //возвращаем байты
  77.         }
  78.  
  79.         static void writeImageBytes(Bitmap img, byte[] bytes)
  80.         {
  81.             var data = img.LockBits(new Rectangle(0, 0, img.Width, img.Height),  //блокируем участок памати, занимаемый изображением
  82.                 ImageLockMode.WriteOnly,
  83.                 img.PixelFormat);
  84.             Marshal.Copy(bytes, 0, data.Scan0, bytes.Length); //копируем байты массива в изображение
  85.  
  86.             img.UnlockBits(data);  //разблокируем изображение
  87.         }
  88. }
  89.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement