Gavreg

Байты

Mar 9th, 2021
529
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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.  
RAW Paste Data

Adblocker detected! Please consider disabling it...

We've detected AdBlock Plus or some other adblocking software preventing Pastebin.com from fully loading.

We don't have any obnoxious sound, or popup ads, we actively block these annoying types of ads!

Please add Pastebin.com to your ad blocker whitelist or disable your adblocking software.

×