C\#영상 피라미드 생 성 원리 실례
영상 피 라 미 드 는 원시 이미 지 를 탑 모양 과 유사 한 영상 구조 로 처리 하 는 것 이다(이 개념 에 얽 매 이지 마 세 요)
영상 피라미드 중 가장 정교 한 층 의 해상 도 는 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;
}
내 가 쓴 이 함수 에 따라 피 라 미 드 를 만 들 면 인접 한 그림 층 간 의 대응 점 픽 셀 값 이 같 습 니 다.