hỏi về cách xử lí file .BMP 8 bit

Nguyễn Thành Trung
(nt2)

New Member
Mình có 1 bài tập về xử lí file .BMP (mở file, thay đổi kích thước). Đối với file .BMP 24 bit thì OK rồi vì mỗi pixel gồm 3 bytes màu (B, G, R). Nhưng đối với file 8 bit thì có thêm phần optional palette mình không biết đọc thế nào. Ai biết có thể hướng dẫn mình được không? Thanks
 
Khè, vẫn mở file .bmp & thay đổi kích thước file .bmp 8 bit như thường. 8 bit = 256 màu thì phải. Cái nì cũng giống như file .gif vì .gif chỉ hiển thị được tối đa 256 màu. Khi mở file & thay đổi kích thước rùi lưu lại = .bmp 8 bit thì nó sẽ tự động generate palette thích hợp dựa vào những màu hiện có trên file hình. (Photoshop). Ngoài ra cũng có thể save file thành 1 file .bmp 24bit.
 
Anh ý đang nói về đọc file BMP từ chương trình tự viết cơ mà em? Có đúng thế ko anh :-?
 
Khè, thế thì cứ mở file 24bit như thường, thực hiện bất cứ thứ rì tùy thích sau đó save nó lại thành .gif trước rùi save lại thành .bmp là tự khắc nó sẽ chuyển thành 8 bit hết.
 
Vì 54 bytes đầu tiên của file bitmap là header & 1024 bytes tiếp theo chứa thông tin về bảng màu ---> có thể làm như sau:
Mã:
...
unsigned char i, palette[256][4];
//...
//Mở file và đọc header & các xử lý khác nếu cần thiết
fread(palette, 1024, 1, 8bit_bmp_file_handle);
Bảng màu sẽ nằm trong array palette.
 
Chỉnh sửa lần cuối:
Nhưng mà khi thay đổi kích thước hình ảnh thì cái palette màu cũng bi thay đổi theo. cái mà anh cần hỏi là nó sẽ thay đổi như thế nào? Theo công thức nào?
 
Chỉnh sửa lần cuối:
Chẳng có công thức nèo cả vì khi xử lý ảnh, user có thể thay 1 màu trong hình = 1 màu bất kỳ, chẳng có cách nèo đoán trước cả.

Tuy nhiên, có cách sau có thể hoạt động trong mọi trường hợp:
- Khi bắt đầu save hình, loop qua từng pixel 1 của hình để đếm số lượng màu.
- Nếu số lượng màu <= 256, lấy tất cả số màu nì làm palette.
- Nếu số màu > 256. Lấy số lượng màu đếm được trong hình chia cho 256, lưu số nì vào biến x bất kỳ. Làm tròn lên số x lưu lại vào chính biến x.
- Trong số các màu có trong hình sau xử lý, tìm màu cố số hex nhỏ nhất & màu có số hex lớn nhất.
- Bắt đầu từ màu có số hex nhỏ nhất, +x cho đến khi > số lượng màu có được, sau mỗi lần +x, lưu số nhận được vào 1 array.
- Lặp qua array chứa tất cả màu có trong hình. Làm tròn số nì đến số gần nhất chứa trong array x. Lưu số mới trong 1 array y khác.
- Array y này chính là palette cần thiết.

Trong trường hợp có <= 256 màu sau xử lý. Chất lượng hình ảnh sẽ ko thay đổi. Tuy nhiên nếu có >256 màu sau xử lý. Chất lượng hình ảnh sẽ kém đi do phải giảm bớt số màu để file ko vượt quá 8bit màu.
 
Back
Bên trên