На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
! Правила раздела "Программирование графики"
1) Данный раздел предназначен для обсуждения проблем, возникающих при программировании задач, связанных с чтением, сохранением, обработкой, созданием, отрисовкой графической информации (в том числе - 3D [OpenGL, Direct3D] и анимации [в т.ч. VFW, DirectShow, OpenDML]).
Флэш обсуждают здесь!.

2) Если вы хотите получить совет для конкретной платформы/языка программирования, обязательно укажите их в вопросе.

3) Уважаемые новички! Мы приветствуем Ваше желание научить всех посетителей раздела правильному программированию. Но огромная просьба, перед тем, как писать поучения в старых (последний ответ - "старее" месяца, а особенно, если вопрошавший не появляется на форуме уже не первый месяц, в чем можно убедиться в его профиле) темах, хорошо подумать, будет ли кому-нибудь, кроме Вас cамих, это интересно.



Ваше мнение о модераторах: user posted imageBarazuk, user posted imageOpenGL, user posted imageMikle
Модераторы: OpenGL, barazuk, Mikle
  
> Разбить изображение на слои...
    Привет всем.
    У меня возникла необходимость разбить картинку в RGB на слои: красный, зеленый и синий. Подскажите, плиззз, как это реализовать :rolleyes:
      ExpandedWrap disabled
         //Формирование красного слоя
                        for (int w = 0; w < myLoadedImage.Width; ++w)
                            for (int h = 0; h < myLoadedImage.Height; ++h)
                            {
                                int temp = myLoadedImage.GetPixel(w, h).ToArgb();
                                Color c = Color.FromArgb(0, temp & 0xFF, 0, 0);
                                myLoadedImage.SetPixel(w, h, c);
                                
                            }
        //////////////////////////////
         for (int x = 0; x < myLoadedImage.Width; ++x)
                            for (int y = 0; y < myLoadedImage.Height; ++y)
                            {
                                int temp = myLoadedImage.GetPixel(x, y).ToArgb();
                                Color c = Color.FromArgb(0, 0, (temp & (255 * 256)) / 256, 0);
                                myLoadedImage.SetPixel(x, y, c);
                            }
        /////////////////////////////////////
         for (int x = 0; x < myLoadedImage.Width; ++x)
                            for (int y = 0; y < myLoadedImage.Height; ++y)
                            {
                                int temp = myLoadedImage.GetPixel(x, y).ToArgb();
                                Color c = Color.FromArgb(0, 0, 0, (temp & (255 * 256 * 256)) / (256 * 256));
                                myLoadedImage.SetPixel(x, y, c);
                            }

      Цитата albom @
      ...копируешь первый байт в первый буфер, второй байт — во сторой, третий — в третий, затем четвертый байт снова в первый и так далее...
      - это так(код)?
      Я так сделал(нашел в пособниках).
        Скачал я с инета для обработки изображения, создал три экземпляра этого класса - у каждого своя обработка- разбиение на слои, а вот отобразить не получается - черные квадраты :unsure:
        Вызывал:
        ExpandedWrap disabled
          ...
          using (bmp1 = new BitmapDecorator(исходное_bmp))
          {
          //Обработка
          ...
          }
          using (bmp2 = new BitmapDecorator(исходное_bmp))
          {
          //Обработка
          ...
          }
          using (bmp1 = new BitmapDecorator(исходное_bmp))
          {
          //Обработка
          ...
          }
          }

        Вот этот класс:
        ExpandedWrap disabled
          public class BitmapDecorator : IDisposable  
          {      
          private readonly Bitmap _bitmap;    
          private readonly bool _isAlpha;
          private readonly int _width;
          private readonly int _height;
          private BitmapData _bmpData;    
          private IntPtr _bmpPtr;    
          private byte[] _rgbValues;  
          private int index;  
          private int b;  
          private int r;  
          private int g;
          private int a;  
          private int r1;
          private int g1;
          private int b1;
          private int a1;
          public BitmapDecorator(Bitmap bitmap)
          {
          if (bitmap == null)
          throw new ArgumentNullException();
          _bitmap = bitmap;
          if (_bitmap.PixelFormat == (PixelFormat.Indexed | _bitmap.PixelFormat))throw new ArgumentException("Can't work with indexed pixel format");
          _isAlpha = (Bitmap.PixelFormat == (Bitmap.PixelFormat | PixelFormat.Alpha));
          _width = bitmap.Width;
          _height = bitmap.Height;
          Lock();
          }
          #region properties  
          public Bitmap Bitmap
          {
          get { return _bitmap; }
          }
          #endregion
          #region methods
          private void Lock()
          {
          Rectangle rect = new Rectangle(0, 0, _width, _height);  
          _bmpData = Bitmap.LockBits(rect, ImageLockMode.ReadWrite, tmap.PixelFormat);
          _bmpPtr = _bmpData.Scan0;  
          int bytes = _width * _height * (_isAlpha ? 4 : 3);      
          _rgbValues = new byte[bytes];
          Marshal.Copy(_bmpPtr, _rgbValues, 0, _rgbValues.Length);    
          }
          private void UnLock()
          {
          // Copy the RGB values back to the bitmap
          Marshal.Copy(_rgbValues, 0, _bmpPtr, _rgbValues.Length);        
          // Unlock the bits.
          Bitmap.UnlockBits(_bmpData);
          }
          public void SetPixel(int x, int y, int r, int g, int b)    
          {
          if (_isAlpha)
          {
          index = ((y * _width + x) * 4);            
          _rgbValues[index] = (byte)b;                
          _rgbValues[index + 1] = (byte)g;                
          _rgbValues[index + 2] = (byte)g;                
          _rgbValues[index + 3] = 255;
          }
          else
          {
          index = ((y * _width + x) * 3);            
          _rgbValues[index] = (byte)b;                
          _rgbValues[index + 1] = (byte)g;                
          _rgbValues[index + 2] = (byte)r;            
          }      
          }
          public void SetPixel(int x, int y, Color color)    
          {
          if (_isAlpha)          
          {
          index = ((y * _width + x) * 4);            
          _rgbValues[index] = color.B;
          _rgbValues[index + 1] = color.G;                
          _rgbValues[index + 2] = color.R;                
          _rgbValues[index + 3] = color.A;
          }
          else
          {
          index = ((y * _width + x) * 3);
          _rgbValues[index] = color.B;
          _rgbValues[index + 1] = color.G;
          _rgbValues[index + 2] = color.R;
          }
          }
          public void SetPixel(Point point, Color color)      
          {
          if (_isAlpha)          
          {
          index = ((point.Y * _width + point.X) * 4);        
          _rgbValues[index] = color.B;                
          _rgbValues[index + 1] = color.G;                
          _rgbValues[index + 2] = color.R;                
          _rgbValues[index + 3] = color.A;
          }
          else
          {
          index = ((point.Y * _width + point.X) * 3);        
          _rgbValues[index] = color.B;                
          _rgbValues[index + 1] = color.G;                
          _rgbValues[index + 2] = color.R;
          }
          }
          public Color GetPixel(int x, int y)
          {
          if (x > _width - 1 || y > _height - 1)              throw new ArgumentException();          
          if (_isAlpha)          
          {
          index = ((y * _width + x) * 4);            
          b = _rgbValues[index];              
          g = _rgbValues[index + 1];              
          r = _rgbValues[index + 2];              
          a = _rgbValues[index + 3];              
          return Color.FromArgb(a, r, g, b);          
          }
          else
          {
          index = ((y * _width + x) * 3);            
          b = _rgbValues[index];              
          g = _rgbValues[index + 1];              
          r = _rgbValues[index + 2];              
          return Color.FromArgb(r, g, b);
          }
          }
          public int ColorDiff(int x1, int y1, int x2, int y2)        
          {
          if (_isAlpha)
          {
          index = ((y1 * _width + x1) * 4);              
          b = _rgbValues[index];              
          g = _rgbValues[index + 1];              
          r = _rgbValues[index + 2];              
          a = _rgbValues[index + 3];          
          }
          else
          {
          index = ((y1 * _width + x1) * 3);              
          b = _rgbValues[index];              
          g = _rgbValues[index + 1];              
          r = _rgbValues[index + 2];
          }
          if (_isAlpha)
          {
          index = ((y2 * _width + x2) * 4);  
          b1 = _rgbValues[index];
          g1 = _rgbValues[index + 1];            
          r1 = _rgbValues[index + 2];            
          a1 = _rgbValues[index + 3];        
          }
          else
          {
          index = ((y2 * _width + x2) * 3);              
          b1 = _rgbValues[index];            
          g1 = _rgbValues[index + 1];            
          r1 = _rgbValues[index + 2];
          }
          r = r1 - r;
          g = g1 - g;
          b = b1 - b;
          if (r < 0)
          r = -r;
          if (g < 0)
          g = -g;
          if (b < 0)
          b = -b;
          return r + g + b;
          }
          public int ColorDiff(int i1, int i2)
          {
          if (_isAlpha)      
          {
          index = (( i1) * 4);                
          b = _rgbValues[index];
          g = _rgbValues[index + 1];              
          r = _rgbValues[index + 2];              
          a = _rgbValues[index + 3];
          }
          else
          {
          index = ((i1) * 3);
          b = _rgbValues[index];              
          g = _rgbValues[index + 1];              
          r = _rgbValues[index + 2];
          }
          if (_isAlpha)
          {
          index = ((i2) * 4);
          b1 = _rgbValues[index];
          g1 = _rgbValues[index + 1];
          r1 = _rgbValues[index + 2];
          a1 = _rgbValues[index + 3];
          }
          else
          {
          index = ((i2) * 3);
          b1 = _rgbValues[index];
          g1 = _rgbValues[index + 1];
          r1 = _rgbValues[index + 2];
          }
          r = r1 - r;
          g = g1 - g;
          b = b1 - b;
          if (r < 0)
          r = -r;
          if (g < 0)
          g = -g;
          if (b < 0)
          b = -b;
          return r + g + b;
          }
          public int ColorDiff(Point point1, Point point2)        
          {
          return ColorDiff(point1.X, point1.Y, point2.X, point2.Y);      
          }
          public Color GetPixel(Point point)
          {
          return GetPixel(point.X, point.Y);      
          }
          #region IDisposable Members
          public void Dispose()      
          {
          UnLock();      
          }
          #endregion
          #endregion
          }
        Сообщение отредактировано: __Dim__ -
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        [ Script Execution time: 0,0778 ]   [ 15 queries used ]   [ Generated: 23.12.14, 02:57 GMT ]  

        Rambler's Top100