C#에서 알파를 유지하면서 PNG를 로드하고 TGA로 내보내는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1514846

  •  19-09-2019
  •  | 
  •  

문제

저는 게임용 자산 제작 중 일부를 자동화하는 도구를 작성 중입니다.제가 하고 싶은 것은 PNG 파일 폴더를 가져와 텍스처 아틀라스로 결합한 다음 아틀라스를 TGA로 내보내고 UV 좌표를 XML로 내보내는 것입니다.

C#에서 PNG 파일을 로드하는 데 어떤 방법을 사용해야 하는지 잘 모르겠습니다. 여러 가지가 있는 것 같습니다.TGA로 추출할 수 있도록 색상/알파 데이터에 대한 액세스를 제공하는 C#에서 이미지를 로드하는 데 권장되는 방법은 무엇입니까?

또한 C#으로 이동할 계획인 C++의 TGA 생성 코드가 이미 있지만 TGA를 생성/저장하기 위해 .Net에 이미 사용할 수 있는 것이 있는지 궁금합니다.

읽어 주셔서 감사합니다.

도움이 되었습니까?

해결책

PNG 파일을 .Net 비트맵으로 로드하는 것은 쉽습니다.

Bitmap bmp = (Bitmap)Bitmap.FromFile("c:\wherever\whatever.png");
// yes, the (Bitmap) cast is necessary. Don't ask me why.

비트맵을 로드한 후에는 비트맵의 LockBits 메서드(StackOverflow에 많은 LockBits 코드 샘플이 있음)를 사용하여 모든 정보(알파 채널 정보 포함)에 가장 효율적으로 액세스할 수 있습니다.

업데이트:다음은 LockBits를 사용하여 비트맵의 데이터를 픽셀 단위로 액세스하는 방법을 보여주는 코드 샘플입니다.

System.Drawing.Imaging.BitmapData data =
    bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height),
    System.Drawing.Imaging.ImageLockMode.ReadOnly, bmp.PixelFormat);
unsafe
{
    // important to use the BitmapData object's Width and Height
    // properties instead of the Bitmap's.
    for (int x = 0; x < data.Width; x++)
    {
        int columnOffset = x * 4;
        for (int y = 0; y < data.Height; y++)
        {
            byte* row = (byte*)data.Scan0 + (y * data.Stride);
            byte B = row[columnOffset];
            byte G = row[columnOffset + 1];
            byte R = row[columnOffset + 2];
            byte alpha = row[columnOffset + 3];
        }
    }
}
bmp.UnlockBits(data);

이 코드를 사용하려면 프로젝트에 대해 "안전하지 않은 코드 허용" 컴파일러 옵션을 설정해야 합니다.Bitmap의 GetPixel(x, y) 메서드를 사용할 수도 있지만 이는 놀라울 정도로 느립니다.

다른 팁

코드 샘플이 없지만 가이드 라인을 줄 수 있습니다.

  1. image.fromfile ()을 사용하여 PNG를로드하십시오. .NET는 PNG로드를 지원합니다
  2. 타르가에 대한 파일 핸들을 엽니 다. xmldocument를 만듭니다. .NET은 Targa를 지원하지 않으므로 수동으로 작성해야합니다.
  3. 비트 맵을 잠그고 픽셀로 얻습니다. getPixel ()는 매우 느립니다. 이 방법의 이름이 lockbits ()라고 생각합니다. 표면에 대한 포인터가있어 픽셀을 읽습니다.
  4. Targa에게 편지를 보내십시오. Targa는 컨테이너 형식이므로 모든 비트 맵에 맞습니다.
  5. UV를 XML로 저장하십시오.

Targa 형식

팔레트를 사용 하시겠습니까? 게임을 만들기 때문에 비트 맵에 대한 팔레트를 계산하고 파일 크기를 줄이기 위해 Targa에 넣는 것이 좋습니다.

오, 내가 잊기 전에 .NET은 RGBA를 사용하지 않고 대신 픽셀은 bgra입니다. 왜 나에게 왜 그런지 묻지 마세요.

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