문제

C# 질문(.net 3.5).ushort[,] 픽셀 필드가 있는 ImageData 클래스가 있습니다.저는 독점 이미지 형식을 다루고 있습니다.ImageData 클래스는 생성자에서 파일 위치를 가져온 다음 파일 확장자를 켜서 디코딩 방법을 결정합니다.여러 이미지 파일의 헤더에는 "비트 심도" 필드가 있습니다.헤더를 디코딩한 후 픽셀 값을 "픽셀" 배열로 읽습니다.지금까지 16bpp를 넘지 않았으므로 괜찮습니다.하지만 32bpp가 있다면 어떨까요?

내가 원하는 것은 런타임에 픽셀 유형을 결정하는 것입니다.헤더에서 비트 깊이를 읽은 후 픽셀 데이터를 메모리에 복사하기 전에 이 작업을 수행하고 싶습니다.어떤 아이디어가 있나요?

도움이 되었습니까?

해결책

문제를 요약하기 위해 다음과 같은 수업이 있기를 원합니다. ushort[,] 픽셀 필드(픽셀당 16비트)를 사용하는 경우도 있고 uint32[,] 픽셀 필드(픽셀당 32비트)를 사용하는 경우도 있습니다.이를 달성하는 방법에는 몇 가지가 있습니다.

32비트 및 16비트 하위 클래스로 Pixel 클래스를 만들고 wazoo의 다양한 연산자를 재정의하여 ushort / uint32에 대한 대체 항목을 만들 수 있지만 이로 인해 많은 오버헤드가 발생하고 올바르게 수행하기가 까다로우며 결정하기가 더 까다롭습니다. 맞다면.또는 픽셀 데이터에 대한 프록시 클래스를 만들 수 있습니다(ushort[,] 또는 uint32[,] 배열을 포함하고 유용하게 필요한 모든 접근자가 있음).단점은 일부 16비트/32비트 모드 플래그에 따라 한 방향 또는 다른 방식으로 실행되는 ImageData 클래스에 많은 특수 사례 코드가 생길 가능성이 높다는 것입니다.

내 생각에 더 나은 해결책은 ImageData를 16비트 및 32비트 클래스로 하위 클래스화하고 팩토리 메서드를 사용하여 인스턴스를 만드는 것입니다.예:ImageData는 기본 클래스이고 ImageData16bpp 및 ImageData32bpp는 하위 클래스이며 정적 메서드 ImageData.Create(string imageFilename)는 헤더 데이터에 따라 ImageData16bpp 또는 ImageData32bpp를 생성하는 팩토리 메서드입니다.예를 들어:

public static ImageData Create(string imageFilename)
{
   // ...
   ImageDataHeader imageHeader = ParseHeader(imageFilename);
   ImageData newImageData;
   if (imageHeader.bpp == 32)
   {
      newImageData = new ImageData32(imageFilename, imageHeader);
   }
   else
   {
      newImageData = new ImageData16(imageFilename, imageHeader);
   }
   // ...
   return newImageData;
}

다른 팁

나는 생성자에서 그런 작업을 하지 말라고 말하고 싶습니다. 제 생각에는 생성자는 그렇게 많은 작업을 해서는 안 됩니다.비트 깊이를 결정하기 위해 파일을 읽는 팩토리 메서드를 사용한 다음 클래스의 올바른 일반 변형을 구성하고 반환하도록 합니다.

디코드 함수가 모든 배열의 기본 클래스인 Array 유형의 객체를 반환하도록 합니다.그런 다음 유형에 관심이 있는 사람들은 픽셀을 살펴보고 싶다면 "if (a is ushort[,])" 등을 수행할 수 있습니다.이런 방식으로 수행하는 경우 ImageData에 배열을 할당해야 하며 그 반대는 아닙니다.

또는 호출자는 아마도 어떤 종류의 픽셀 배열을 알고 있을 것입니다. 그들 당신이 사용하기를 원합니다.8bpp 또는 16bpp 이미지라도 32bpp 화면으로 디코딩하는 경우 ushort 대신 uint를 사용해야 합니다.따라서 T 유형이 무엇이든 정수로 디코딩하는 ImageData 함수를 작성할 수 있습니다.

문제의 근본 원인은 원하는 출력 형식의 종류를 결정하는 방법을 모른다는 것입니다.이를 먼저 파악해야 하며 프로그램 구문은 그 다음입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top