Lập trình xử lý ảnh: Tối ưu hóa dữ liệu dùng kênh alpha.

Thảo luận trong 'Lập trình & Đồ hoạ' bắt đầu bởi Nguyễn Tài Hải, 9/6/12.

  1. Nguyễn Tài Hải

    Nguyễn Tài Hải Youtube Master Race

    Tham gia ngày:
    12/5/12
    Bài viết:
    25
    Nơi ở:
    Ho Chi Minh City
    Là một hard core progrmmer chúng ta luôn chú trọng tiết kiệm dữ liệu sử dụng. Hôm nay tôi sẽ hướng dẫn bạn một phương thức để tiết kiệm 75% dữ liệu có kênh alpha.



    Hôm nay chúng ta sẽ bàn luận một số vấn đề bên lề trước khi đi vào cài đặt trên HTML5 ở phần 2 nhé.

    • Màu sắc số học được cấu thành từ đâu?
    • Alpha là gì?
    • Số học màu sắc
    • Tại sao phải dùng hình có alpha trong game?
    • Tại sao hình alpha lại tốn dữ liệu?
    • Giải pháp
    • Những con số biết nói


    Chúng ta sẽ đần giải quyết những câu trả lời này nhé.


    1. Màu sắc số học được cấu thành từ đâu?

    Câu hỏi này đúng ra không nên đặt ra bởi chúng ta ở đây ai cũng đã làm game và quyết đinh hướng game là nghề nghiệp của mình nên câu hỏi này là quá dễ. Nhưng cũng nên nêu ra để chúng ta có một cái nhìn tổng quan nhất.

    Trong máy tính màu sắc mỗi điểm ảnh được tổ hợp từ 3 màu cơ bản nhất: R G B tương ứng với Red - Green - Blue. Nói như vậy bạn có thể khó hình dung nhưng khi nhìn hình ảnh sau các bạn có thể mường tượng ngay được thực tế nó như thế nào:


    Chú ý: Các bạn hãy nhìn về phía góc phải phía dưới cùng. Biểu tượng của Việt Game Dev Net cũng được cấu thành từ 3 màu cơ bản nhất của mỗi game bạn làm.

    2.Alpha là gì?

    Cũng nhìn vào logo nhé chữ N có màu tim tím đó là màu gì? Bạn nào đoán rằng đó là Alpha thì bạn quả là người có kinh nghiệm làm game.

    Alpha chính là kênh cuối cùng mà chúng ta cần đề cập tới. Khi đó chúng ta đã có đầy đủ thành phần bao gồm: R G B A tương ứng Red - Green - Blue và Alpha. Cũng có thể sắp lại là A R G B.

    Vậy alpha để làm gì? Alpha đại diện cho sự trong suốt của hình ảnh. Tức là ánh sáng có thể xuyên qua được hình ảnh hay không. Nếu Alpha = 0 tức là khi đó hình ảnh hoàn toàn trong suốt. Nếu kênh Alpha = 255 thì ánh sáng không thể nhìn xuyên được hình ảnh đó.

    Tại sao lại có 0 với 255 ở đây. Khó hiểu quá. Bởi chúng ta cần phải bàn đến Số hóa màu sắc trước khi quay lại vấn đề trên.

    3. Số hóa màu sắc

    Màu sắc được lưu trữ trong máy tính như thế nào? Đầy đủ nhất tức là hình 32 bits: A R G B tương ứng với: 8 8 8 8. Đối chiếu với trên các bạn có thể hiểu được giá trị nhỏ nhất của một màu là 0 cao nhất là 255.

    Khi làm việc càng nhiều với màu sắc hình ảnh thì bạn sẽ thấy rằng mắt chúng ta không có khả năng phân biệt được những hình có dải màu quá gần nhau. Chính vì lẽ đó mà có những lúc chất lượng hình sẽ được giảm xuống để tiết kiệm dung lượng. Khi đó mỗi màu chỉ còn: 4 4 4, 5 6 5 ... khi đó dung lượng giảm đi rõ rệt.

    4.Tại sao dùng alpha trong game?

    Khi chúng ta dùng đến kênh Alpha tức là lúc chúng ta muốn nâng cao chất lượng sản phẩm của mình. Có thể nói vậy rất chung chung và khó hình dung. Sau đây sẽ đưa ra một ví dụ để bạn thấy hiệu quả của kênh Alpha:

    [​IMG]

    [​IMG]



    Nhìn hai tấm hình này bạn có thể cảm nhận rõ ràng sức manh của kênh alpha. Nó khiến cho chất lượng sản phẩm của bạn được nâng lên rất cao.

    5.Tại sao hình alpha lại tốn dữ liệu?

    Chắc chắn là dùng kênh alpha bạn sẽ tốn dữ liệu và thậm chí là tốn hơn rất nhiều lúc ban đầu bởi những lý do sau:


    Tốn thêm một kênh tức thêm 8 bits trên mỗi pixel của hình ảnh (pixel là mỗi điểm ảnh trên tấm hình)

    Để chất lượng cao khó nén dữ liệu khi dùng kênh alpha. Tức là khi này chúng ta thường dùng định dạng PNG, TGA nặng hơn rất nhiều so với JPG, JPEG...

    6. Giải pháp

    Con người khó tính. Cái gì cũng muốn: Ngon Bổ mà lại Rẻ. Chính vì lẽ đó chúng ta mới có những giải pháp tuyệt vời.



    Thay vì hình 32bits chúng ta sẽ có 2 giải pháp sau:


    Chia là 2 hình: Một hình JPG (dữ liệu nén) và một hình PNG8 (Chỉ chứa kênh alpha mà thôi). Với cách này bạn sẽ tiết kiệm được khá nhiều nhờ vào khả năng nén cực tốt của giải thuật nén JPG

    [​IMG]


    Chỉ dùng duy nhất 1 hình JPG kênh alpha sẽ được giải thuật gray scale tổ hợp trong quá trình xử lý. Trường hợp này bạn còn tiết kiệm thêm được gần 300K của kênh alpha so với giải pháp 1.

    [​IMG]


    7. Những con số biết nói:

    Lý luận luôn là hàn lâm. Đôi lúc không mang lại sự tin tưởng. Nhưng số liệu toán học thì luôn cho ta một cái nhìn chắc chắn và củng cố lý luận một cách vững chắc. Sau đây là những con số cụ thể:

    Ví dụ:

    Một hình 32bit kích thước: 200x200 -> số lượng bit: 32x200x200 = 1.280.000 bits = 1.280.000 /8 = 160.000 bytes = 160.000/1024 = 156.25 KB

    Một hình 24bit kích thước: 200x200 -> số lượng bit: 24x200x200 = 960.000 bits = 960.000 /8 = 120.000 bytes = 120.000/1024 = 117.19 KB



    Đây là hình chuẩn chưa hề có giải thật nén nào. Để kiểm chứng bạn lưu dưới dạng BMP(Bitmap) thì sẽ thấy những con số gần giống như trên. Sự sai lệch là do header thêm vào để quy định cho từng định dạng. Đơn giản như vậy chúng ta đã tiết kiệm được 39.06 KB rồi.

    Trong thực tế thì những định dạng PNG, GIF, JPG, JPEG được sử dụng một cách hợp lý sẽ cho hiệu quả rất lớn trong việc giảm dung lượng data của sản phẩm đầu ra.



    Chúng ta kết thúc phần phân tích ở đây. Phần sau chúng ta sẽ cài đặt nó vào trong game. Có một câu hỏi để các bạn trả lời nhé. Phần trên mình có nói màu tím của chữ N là kênh alpha. Tại sao tôi lại nói như vậy?

    Nguồn: http://vietgamedev.net
     

Chia sẻ trang này