2009-10-03 20 views
6

Tôi đang viết một công cụ để tự động hóa một số việc tạo nội dung cho trò chơi. Những gì tôi muốn làm là lấy một thư mục các tệp PNG, kết hợp chúng thành một bản đồ kết cấu và sau đó xuất bản đồ dạng TGA và UV coords thành XML.Cách tải PNG và xuất sang TGA giữ alpha trong C#?

Tôi không chắc nên sử dụng phương pháp nào để tải các tệp PNG trong C# vì dường như có một số phương pháp. Phương pháp được đề nghị để tải hình ảnh trong C# cung cấp quyền truy cập vào dữ liệu màu/alpha để tôi có thể giải nén nó vào TGA là gì?

Tôi cũng đã có mã tạo TGA trong C++ mà tôi dự định chuyển sang C# nhưng tôi tự hỏi liệu có bất kỳ thứ gì đã có sẵn trong .Net để tạo/lưu TGA không?

Cảm ơn bạn đã đọc.

Trả lời

8

tải một file PNG vào Net Bitmap là dễ dàng:

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

Một khi bạn đã Bitmap nạp, bạn có thể truy cập vào tất cả các thông tin của mình (bao gồm cả thông tin kênh alpha) một cách hiệu quả nhất sử dụng phương pháp LockBits của Bitmap (có rất nhiều mẫu mã LockBits trên StackOverflow).

Cập nhật: đây là một mẫu mã cho thấy làm thế nào để sử dụng LockBits để truy cập pixel-by-pixel dữ liệu của Bitmap:

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); 

Bạn cần phải đặt "Cho phép mã không an toàn" tùy chọn trình biên dịch cho bạn dự án để sử dụng mã này. Bạn cũng có thể sử dụng phương thức GetPixel (x, y) của Bitmap, nhưng điều này rất chậm.

+0

Dàn diễn viên là cần thiết vì Bitmap.FromFile không thực sự tồn tại - nó đang gọi phương thức tĩnh Image.FromFile của lớp cơ sở. – bobbymcr

+0

@bobbymcr: chắc chắn, nhưng tại sao Bitmap không ghi đè FromFile, hãy gọi base.FromFile và truyền Hình ảnh được trả về dưới dạng bitmap? – MusiGenesis

0

Tôi không có một mẫu mã, nhưng tôi có thể cung cấp cho bạn một phương châm

  1. tải PNG sử dụng Image.FromFile(). Hỗ trợ .NET đang tải PNG
  2. Mở trình xử lý tệp cho targa của bạn. Tạo một XmlDocument. .NET không hỗ trợ targa, vì vậy bạn phải tự viết nó.
  3. Khóa bitmap để lấy pixel. GetPixel() rất chậm. Tôi nghĩ phương thức này được đặt tên là LockBits(). Bạn sẽ đưa con trỏ lên bề mặt để đọc các pixel
  4. Viết cho targa. Targa là định dạng vùng chứa, vì vậy mọi bitmap phải phù hợp.
  5. Lưu UV dưới dạng Xml.

Targa format

Bạn có muốn sử dụng một bảng màu? Kể từ khi bạn thực hiện một trò chơi, tôi sẽ khuyên bạn nên tính toán một bảng màu cho bitmap của bạn và đặt nó vào targa để giảm kích thước tệp.

Ồ, trước khi tôi quên, .NET không sử dụng RGBA, thay vào đó, các pixel là BGRA. Đừng hỏi tôi tại sao, nhưng nó như thế.

Các vấn đề liên quan