C\#영상 피라미드 생 성 원리 실례

2573 단어 영상피라미드
여기 서 먼저 피라미드 의 원 리 를 말씀 드 리 겠 습 니 다.
영상 피 라 미 드 는 원시 이미 지 를 탑 모양 과 유사 한 영상 구조 로 처리 하 는 것 이다(이 개념 에 얽 매 이지 마 세 요)
영상 피라미드 중 가장 정교 한 층 의 해상 도 는 16*16 이 고,다음 층 은 8*8 이 며,4*4,2*2,1*1 순이다.
아래 그림 에서 보 듯 이
그림 에서 격자 정점 은 원본 그림 16*16 을 나타 낸다.빨간색 차 호 는 8*8 을 대표 합 니 다.검은색 원 은 4*4 를 의미 합 니 다.
상기 원리 에 따 르 면 프로 그래 밍 은 단지 격 점 샘플링 에 불과 하 다.그러면 인접 한 두 그림 이 대응 점 에서 의 그 레이스 케 일 값 은 같 아야 한다.물론 나 는 이렇게 생각한다.
C\#Drawing 네 임 스페이스 에 있 는 Bitmap 클래스 에 영상 피 라 미 드 를 처리 하 는 함수 가 있 습 니 다

public void mipmaping()

{

    Bitmap jpgsource =new  Bitmap(@"E:\height512.jpg");

    Bitmap jpgTarget = new Bitmap(jpgsource, jpgsource.Width>>1, jpgsource.Height>>1);

    jpgTarget.Save(@"E:\height256.jpg");

  }

그러나 내 가 픽 셀 을 비교 한 후에 이 두 장의 그림 에서 대응 하 는 픽 셀 이 같 지 않다 는 것 을 발견 했다.이것 은 한 가지 문 제 를 설명 한다.C\#안의 이 방법 은 반드시 점차적으로 샘플링 하 는 것 이 아니 라 특정한 방법 으로 이미 지 를 늘 리 는 것 이다.이것 은 피라미드 의 원리 에 맞지 않 는 것 같 아서 나 는 다시 피라미드 의 함 수 를 썼 다

public void Rescale()

 {

   Bitmap myImage1024 = new Bitmap(@"E:\height.jpg");

   int width = myImage1024.Height; ;

   int height = myImage1024.Width; ;

   Console.WriteLine(DateTime.Now.ToString());

   for (int power = 1; power < 3; power++)

    {

      Bitmap myImage = new Bitmap(width >> power, height >> power);

 

      int row = myImage.Height;

      int column = myImage.Width;

      for (int i = 0; i < row; i++)

       for (int j = 0; j < column; j++)

       {   // ,

           int i1024 = getcoor(i, power); int j1024 = getcoor(j, power);

           Color color1024 = myImage1024.GetPixel(i1024, j1024);

           myImage.SetPixel(i, j, color1024);

       }

           myImage.Save(string.Format(@"E:\myjpg\height{0}.jpg", width >> power));

     }

           Console.WriteLine(DateTime.Now.ToString());

}

public int getcoor(int i,int power)

{

    if (power > 1)

        return 2 * getcoor(i,power-1) +1;

    else

        return 2 * i + 1;

}

내 가 쓴 이 함수 에 따라 피 라 미 드 를 만 들 면 인접 한 그림 층 간 의 대응 점 픽 셀 값 이 같 습 니 다.

좋은 웹페이지 즐겨찾기