Страница: 1 | 
		
		 
			   
			 
			 
			 
			 Страница: 1 | 
 
			
 
  
		
     
  
    
Вопрос: Скорость выполнения кода
     
    
Добавлено: 15.12.10 14:18
     
      
  
				
			  
					 
			
				 
    
		
       
    
Автор вопроса:  
    
 Лёха | Web-сайт: supersait16.ucoz.ru
      
       
  
Почему этот код
 
    
            if (Value > 100) return null;
            double Pixel = 0, Contrast = (100.0 + Value) / 100.0;
            Contrast *= Contrast;
            int Value_Red, Value_Green, Value_Blue;
            BitmapData MainIMGData = Main.LockBits(new Rectangle(0, 0, Main.Width, Main.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
            int Stride = MainIMGData.Stride;
            IntPtr MainIMGPtr = MainIMGData.Scan0;
            unsafe
            {
                byte* Ptr = (byte*)(void*)MainIMGPtr;
                int N_Offset = Stride - Main.Width * 3;
                for (int Y = 0; Y < Main.Height; ++Y)
                {
                    for (int X = 0; X < Main.Width; ++X)
                    {
                        Value_Blue = Ptr[0];
                        Value_Green = Ptr[1];
                        Value_Red = Ptr[2];
                        Pixel = Value_Red / 255.0;
                        Pixel -= 0.5;
                        Pixel *= Contrast;
                        Pixel += 0.5;
                        Pixel *= 255;
                        if (Pixel < 0) Pixel = 0;
                        if (Pixel > 255) Pixel = 255;
                        Ptr[2] = (byte)Pixel;
                        Pixel = Value_Green / 255.0;
                        Pixel -= 0.5;
                        Pixel *= Contrast;
                        Pixel += 0.5;
                        Pixel *= 255;
                        if (Pixel < 0) Pixel = 0;
                        if (Pixel > 255) Pixel = 255;
                        Ptr[1] = (byte)Pixel;
                        Pixel = Value_Blue / 255.0;
                        Pixel -= 0.5;
                        Pixel *= Contrast;
                        Pixel += 0.5;
                        Pixel *= 255;
                        if (Pixel < 0) Pixel = 0;
                        if (Pixel > 255) Pixel = 255;
                        Ptr[0] = (byte)Pixel;
                        Ptr += 3;
                    }
                    Ptr += N_Offset;
                }
            }
            Main.UnlockBits(MainIMGData);
            return Main;
работает быстрее этого
            double Pixel;
            double Contrast = (100.0 + Value) / 100.0;
            Contrast = Contrast * Contrast;
            for (int I = 0; I < Main.AllPixelsBytes; I += Main.BytesPerPixel)
            {
                BlueVal = *(Main.Unsafe_IMG_Scan0 + (I + 0));
                GreenVal = *(Main.Unsafe_IMG_Scan0 + (I + 1));
                RedVal = *(Main.Unsafe_IMG_Scan0 + (I + 2));
                Pixel = RedVal / 255.0;
                Pixel = Pixel - 0.5;
                Pixel = Pixel * Contrast;
                Pixel = Pixel + 0.5;
                Pixel = Pixel * 255;
                if (Pixel < 0) Pixel = 0;
                if (Pixel > 255) Pixel = 255;
                *(Main.Unsafe_IMG_Scan0 + (I + 2)) = Convert.ToByte(Pixel);
                Pixel = GreenVal / 255.0;
                Pixel = Pixel - 0.5;
                Pixel = Pixel * Contrast;
                Pixel = Pixel + 0.5;
                Pixel = Pixel * 255;
                if (Pixel < 0) Pixel = 0;
                if (Pixel > 255) Pixel = 255;
                *(Main.Unsafe_IMG_Scan0 + (I + 1)) = Convert.ToByte(Pixel);
                Pixel = BlueVal / 255.0;
                Pixel = Pixel - 0.5;
                Pixel = Pixel * Contrast;
                Pixel = Pixel + 0.5;
                Pixel = Pixel * 255;
                if (Pixel < 0) Pixel = 0;
                if (Pixel > 255) Pixel = 255;
                *(Main.Unsafe_IMG_Scan0 + (I + 0)) = Convert.ToByte(Pixel);
            }
            Main.UnLock();
            return Main.Picture;
Вроде всё одинаково,только я сделал так,чтобы всё это выполнялось в одном цикле!
				
		
		
					 
			
				 
  
		
     
  
    
Ответы
     
    
Всего ответов: 3
     
      
  
		
	  
			 
	
		 
    
       
    
Номер ответа: 1 
      
Автор ответа:
 AWP
![]()
ICQ: 345685652 
Вопросов: 96
Ответов: 1212
      
 Web-сайт:  
 Профиль |  | #1
      
Добавлено:  15.12.10 14:54
       
    
       
  
 
    
ну фиг знает...
и что это в начале означает?
		
	  
			 
	
		 
    
       
    
Номер ответа: 2 
      
Автор ответа:
 AgentFire
![]()
![]()
![]()
ICQ: 192496851 
Вопросов: 75
Ответов: 3178
      
 Профиль |  | #2
       
Добавлено:  15.12.10 15:52
       
    
       
  
вероятно, из-за небезопасного одноименного unsafe ?
 
    
		
	  
			 
	
		 
    
       
    
Номер ответа: 3 
      
Автор ответа:
 Лёха
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
Вопросов: 20
Ответов: 79
      
 Web-сайт:  
 Профиль |  | #3
      
Добавлено:  15.12.10 17:10
       
    
       
  
Main.AllPixelsBytes - это Image.Width*Image.Height*(3 или 4,взависимости от формата пикселей)