• Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
  • Tìm kiếm trước khi đặt câu hỏi

Dữ liệu bitmap trong file BMP

Các bài viết hướng dẫn và tham khảo chung, không thuộc ngôn ngữ nào

Điều hành viên: vietluyen

Hình đại diện của người dùng
ledoninh
VIP
VIP
Bài viết: 38
Ngày tham gia: T.Sáu 26/08/2005 3:52 pm
Đến từ: HCMC
Has thanked: 1 time
Liên hệ:

Dữ liệu bitmap trong file BMP

Gửi bàigửi bởi ledoninh » T.Năm 23/04/2009 5:50 pm

Tên bài viết: Dữ liệu bitmap trong file BMP
Tác giả: ledoninh
Cấp độ bài viết: Khá
Tóm tắt: Dữ liệu bitmap trong file BMP


Cấu trúc file BMP: Header (54 bytes) + Bảng màu (nếu có) + Data (màu từng điểm ảnh).

1.Header (54 bytes)
bfType : Word; (2 ký tự : BM, biểu diễn theo Integer là 19778)
bfSize : Longint; (File Size)
bfReserved1 : Word;
bfReserved2 : Word;
bfOffBits : Longint; (Số Bytes Header + Bảng màu: 54 +…xem mục 2)
biSize : Longint;
biWidth : Longint; (Độ rộng ảnh)
biHeight : Longint; (Chiều cao ảnh)
biPlanes : Word;
biBitCount : Word; (Số bits màu: 1, 4, 8, 24)
biCompression : Longint;
biSizeImage : Longint; (Kích thước phần Data ảnh = bfSize - bfOffBits)
biXPelsPerMeter : Longint; (Độ phân giải theo X, dùng khi in)
biYPelsPerMeter : Longint; (Độ phân giải theo Y, dùng khi in)
biClrUsed : Longint;
biClrImportant : Longint;

2. Bảng màu (loại 24 bits không có bảng màu)
Có tất cả 2^24 màu RGB khác nhau, nhưng các loại Bitmap 1bit (2 màu, hoặc chuẩn Windows là trắng-đen), 4 bits (16 màu), 8 bits (256 màu) không thể khai thác hết, nên chỉ liệt kê các màu được dùng trong file. Mỗi màu trong bảng màu được mô tả bằng 4 bytes
(BlueByte, GreenByte, RedByte, ReservByte).
Thí dụ: bảng màu loại 1 bit chuẩn Windows có 8 bytes: 0,0,0,0,255,255,255,0 (4 bytes đầu là màuthứ 0; 4 bytes sau là màu thứ 1. Do chỉ có 0 và 1 nên mô tả mỗi điểm ảnh chỉ cần dùng 1 bit). Tương tự như vậy, bảng màu của file 4 bits có 64 bytes, lần lượt từ màu số 0 đến màu số 15, bảng màu của file 8 bits có 1024 bytes (từ 0 đến 255). Chính vì các màu được liệt kê như vậy nên các màu trong file 1 bit, 4 bits, 8 bits được gọi là Indexed, còn 24 bits – True.
Chú ý: Microsoft đơn giản hoá việc convert màu từ True sang Indexed, nên đã “ban hành” 3 bảng màu chuẩn cho 3 loại file, khi ta convert từ 1 màu 24 bits thành 1 màu 8 bits (thí dụ thế), thì Paintbrush chỉ việc thay thế bằng màu gần giống nhất trong bảng 256 màu chuẩn. Ngược lại, các phần mềm chuyên xử lý ảnh làm việc có tính toán hơn. Trong ảnh 24 bits, nó chọn ra những màu (hoặc vùng màu với sai số nhỏ) xuất hiện nhiều nhất để đưa vào bảng màu của File (loại Indexed) cần tạo. Chính vì thế bảng màu của một file đặc trưng cho chính file đó, chứ không theo “chuẩn” như Paint của Windows. Khi ta convert màu True sang 8 bits (thí dụ, .GIF 256 màu) thì các phần mềm khác làm sai lệch màu rất ít, còn Paint thì quá tệ !

3. Dữ liệu ảnh.
Dữ liệu ảnh được lưu từng điểm cho đến hết hàng ngang (từ trái sang phải), và từng hàng ngang cho đến hết ảnh (từ dưới lên trên).
Đối với mỗi điểm ảnh loại màu Indexed, ta cần 1, 4 hoặc 8 bits để đặc trưng cho điểm đang xét ứng với màu thứ mấy trong bảng màu, thí dụ, giá trị 0111 (=7) trong loại BMP 4 bits cho biết điểm đó có màu 7 (màu xám theo “chuẩn” Windows). Riêng loại 24 bits, không mô tả màu bằng thứ tự trên bảng màu (nếu liệt kê hết bảng màu của nó thì đã tốn cả Gigabyte bộ nhớ và đĩa), mà người ta liệt kê luôn giá trị RGB của 3 màu thành phần, thí dụ, trắng ={255,255,255}, đen = {0,0,0}.
Như vậy, mỗi điểm ảnh loại 1 bit tốn 1/8 bytes (nói cách khác, 1 byte lưu được 8 điểm 1 bit), loại 4 bits - ½ byte, loại 8 bits - 1 byte và loại 24 bits - 3 bytes. Tuy nhiên, tính chung cả bức ảnh thì khối data không hoàn toàn tỉ lệ thuận như vậy, mà thường hơi lớn hơn một chút. Đây là nét “củ chuối” nhất khi ta phải tự mày mò tìm hiểu cấu trúc BMP. Lý do chính ở chỗ người ta ngầm quy ước số bytes cần dùng cho 1 hàng ngang phải là bội của 4. Nếu bạn có ảnh 1x1, 1 bit, thì cũng tốn 66 bytes như ảnh 32x1, 1 bit (54 cho header, 8 cho bảng màu, 4 cho 1 hàng tối thiểu). Và nếu bạn thử xoay bức hình 32x1 (vừa đúng 4 bytes dữ liệu) thành 1x32, sự lãng phí sẽ xuất hiện, lúc đó, mỗi hàng sẽ lãng phí 31 bits, tổng cộng 32 lần như thế (= 31*4 bytes = 124 bytes)!
Quy luật chung như sau:
-Kích thước Data ảnh bằng dữ liệu 1 hàng nhân với chiều cao của ảnh,
-Dữ liệu 1 hàng phụ thuộc vào loại bitmap và độ rộng ảnh :
+ 1 bit : rowbytes = ((width + 31) div 32)*4 (từ 1 đến 32 - hết 4 bytes, vv...)
+ 4 bits : rowbytes = ((width + 7) div 8)*4 (từ 1 đến 8 - hết 4 bytes,...)
+ 8 bits : rowbytes = ((width + 3) div 4)*4 (từ 1 đến 4 - hết 4 bytes,...)
+ 24 bits : rowbytes = ((3*width + 3) div 4)*4 .
Tóm lại, khi đọc từ file ra, ta phải bỏ bớt những byte hoặc bit dư nếu có, còn khi tạo file mới, lại phải thêm “đuôi” nếu dữ liệu dòng không tròn 4n bytes. Ngoài ra, nếu nhiều điểm chung 1 byte (1 bit - 8 điểm, 4 bits - 2 điểm), thì các bits cao sẽ thuộc điểm phía trái, các bits thấp - phía phải. Thí dụ có dữ liệu 96 trong 1 dòng ảnh 4 bits, thì dữ liệu này mô tả 2 điểm liên tiếp và điểm bên trái có giá trị 96\16 = 6 và điểm bên phải có giá trị 96 mod 16 = 0.
Đến đây, có lẽ ai cũng đã biết tự tạo một hình nền có màu sắc thay dổi theo một quy luật nào đó mà mình muốn, và nếu Win bị liệt thì dùng DOS và Pascal vẫn làm được. Nhưng vấn đề này ít ý nghĩa, vì ít người thích tạo hoa văn rườm rà.
Có lẽ việc convert từ 24 bits thành Indexed cũng khỏi cần thảo luận, vì hiện nay công cụ làm việc đó có rất nhiều rồi.

4. Có thể giấu ảnh trong ảnh và giữ nguyên kích thước BMP ?
Hôm nay, mình nói đến việc dùng hiểu biết về cấu trúc file BMP để nghiên cứu một “hiệu ứng đặc biệt” của hình trộn. Một admin (không nêu thương hiệu, vì mình chỉ nói đến nguyên lý thôi, nhưng các thành viên cựu trào của diễn đàn chắc là còn nhớ) đã đưa một file DOC biểu diễn hiệu ứng này với 1 picture. File ảnh được chèn đó không phải BMP, JPG, GIF. Muốn “lột trần bản chất kỹ xảo” của nó, phải dùng thủ thuật sau: Save (Word Document) As Web Page (*.htm), sẽ thấy hình bị tách thành 2 file, file nhỏ là JPG, file lớn hơn là PSD. Dùng một phần mềm xử lý ảnh (thí dụ I_view32) mở file PSD và lưu nó thành 0.bmp, còn file JPG thì bỏ.
Bây giờ bạn copy 0.bmp ra 2 bản sao 1.bmp và 2.bmp. Trong file 1.bmp, bạn gán màu lại như sau:
- Dòng lẻ thì lấy màu điểm lẻ gán luôn cho điểm chẵn kế tiếp,
- Dòng chẵn thì lấy màu điểm chẵn gán luôn cho điểm lẻ ngay trước hoặc kế tiếp.
Như vậy, hình 1.bmp sẽ bị lọc bớt màu của các điển xen kẽ nhau và thay bằng màu của điểm bên cạnh (tương tự các ô màu đen trên bàn cờ vua bị thay thành màu trắng).
Tương tự như vậy, gán lại màu của 2.bmp sao cho tương tự các ô màu trắng của bàn cờ vua bị đổi màu giống ô bên cạnh nó (dòng lẻ và dòng chẵn được thao tác ngược lại, như là dòng chẵn và dòng lẻ ở file 1.bmp). Xem lại 3 hình, ta hiểu ngay hình 0.bmp chính là do 1.bmp và 2.bmp ghép lại !
---
Chú ý: Nếu dùng I_view32 hoặc Photoshop xem 0.bmp, gán lại độ sáng và độ tương phản như “tác giả” đã giới thiệu, ta vẫn thấy hiệu ứng tương tự file DOC nọ, nhưng nếu chèn 0.bmp vào *.DOC thì không thấy hiệu ứng nào cả.


nguyen_dung_vb đã viết:meomeo ơi làm ơn cho sư đệ biết cấu trúc (File) và cách thức load một file EXE vào bộ nhớ.
Nếu có thể thì nêu luôn cho đệ biết một số định dạng File khác nữa (Với hiểu biết của sư huynh)
Nếu được giúp đỡ đệ vô cùng cảm tạ.

Dũng hỏi một câu khá tế nhị đấy. Tóm lại là mình chỉ đưa ra chủ đề về BMP thôi, có thêm thì chỉ thêm một vài loại cấu trúc mà có biết cũng vô hại. Thực ra, khi chưa được tiếp cận Internet, mình đã tự mày mò tìm hiểu được khá nhiều, nay tiếc công thì viết lên vậy thôi, chứ bây giờ vào Net có đầy !
Về EXE file Format và định dạng các kiểu khác, có thể tham khảo tại:
http://www.wotsit.org/search.asp?s=ALLFILES (tìm kiếm mọi kiểu) hoặc
http://www.wotsit.org/search.asp?s=EXE (tìm kiểu EXE, nếu tìm theo list ALLFILES thì nó thuộc trang 14: http://www.wotsit.org/search.asp?page=14&s=ALLFILES ).
Dạo này không hiểu sao lần nào giải phẫu tử thi mấy file EXE đột nhập từ Net đều thấy có chữ MSVBVM60.DLL, hic !


dhttediport đã viết:Bác meomeo ơi, bác lấy một ví dụ đi. Em có một cái file có chữ " Chào bạn " bạn phân tích cho em xem cái chữ " Chào bạn " đó nằm ở đâu nhé, em tìm mà chưa được.

Bác phân tích cái file này cho em nhé. Đọc bài của bác em khoái quá. Cảm ơn bác nhiều
chao ban.rar
(974 Byte) Đã tải 709 lần


E hèm !
Nghe khen thì ai cũng khoái, nhưng mà kèm theo một bài tập thì chua quá, thà không khen, và hỏi chung mọi người thì tốt hơn, hì hì.
Quả là chua, nhưng không phải vì câu hỏi của bạn, mà là vì trong lúc lập trình, mình đặt biến row (hàng thứ row), nhưng khi viết vòng lặp lại "For i = ...", nên kết quả sai, tìm đỏ cả hai con mắt.
Và, cũng may, mình thấy bài số 2 (mục 3.) có sai sót ("(từ trên xuống dưới)"), phải là "từ dưới lên trên" mới đúng. Trí nhớ hơi lộn xộn, xin thông cảm !
Về bức tranh của bạn, nó là 1 ảnh 24 bit bình thường, không có thủ thuật nào khác, chỉ cần cẩn thận theo đúng logic là tìm được (xem Project gửi kèm). Mình còn muốn trích phần có chữ "Chào bạn" ra 1 PictureBox (đã thiết kế trên Form), nhưng cái lỗi trời đánh kia lấy mất hết thời gian rồi.
Bạn thử làm nốt xem sao !
FindInBmp.ZIP
Tìm vùng có Draw trong ảnh BMP
(4.73 KiB) Đã tải 1002 lần



dhttediport đã viết:Bác meomeo ơi, có phải cái vị trí bác tìm là tọa độ theo hàng, cột không?. Em đang dò theo hướng lập trình của bác, quả là hơi khó với trình độ của em ( mới biết VB mà ). Nếu có thời gian, bác tách hẳn cái chữ đó cho hiện lên form nhé. Cái này làm thay đổi hình nền thì tuyệt vời.
Bác có thể giải thích về nội dung lập trình của bác được không?, vì sao bác lại thu nhỏ BMP lại trước khi sử lý. cái này em chưa hiểu.
Cảm ơn bác.


Vậy là đi quá xa rồi. Nếu bạn mới học VB thì làm với những cấu trúc đơn giản đi! Tự nghĩ ra cấu trúc để thực hiện file dữ liệu, rồi thao tác với dữ liệu của mình để quen với các lệnh của VB, cuối cùng mới vọc vào cấu trúc dữ liệu của người khác.
Sở dĩ mình đưa ra chủ đề cấu trúc BMP vì lúc đó Box này chưa có bài nào nói về cấu trúc dữ liệu (tên của Box), và vì những lý do sau đây (ngoài lý do tìm hiểu đơn thuần để hiểu hoặc xử lý ảnh thông thường):
- Nếu đưa Image lên form rồi mới xử lý các điểm ảnh thì chậm hơn rất nhiều so với việc xử lý trong file, thí du như thay đổi màu nền của file Indexed BMP thì chỉ cần thay 4 bytes của bảng màu, còn trên ảnh phải Fill, vv…
- Thực ra vùng dữ liệu màu (colour data) của BMP là khá tùy tiện, có thể tận dụng vào việc khác, nhất là truyền thông tin mật. Các điểm ảnh loại 1 bit đã có thể cho giấu vào trong dó một chuỗi binary (0,1) bất kỳ, loại 4 bit cho giấu mã Hex, còn mỗi điểm ảnh 8 bit và 24 bit thì có thể chứa trong đó 1 hoặc 3 bytes của 1 file bất kỳ (tất nhiên, phải thêm sao cho khối bytes dữ liệu là bội của 4) , mà nếu file đó đã được mã hoá thì khó mà nghĩ ra chuyện gì !
Hôm nay mình muốn chấm dứt phần trình bày về chủ đề này (thảo luận thì được) bằng một ví dụ vui như sau. Mình có 1 About Form Project khá hiện đại (sưu tầm), nén lại thành file zip có kích thước 3954 bytes. Để giấu nó vào BMP, có thể tạo file BMP từ số 0 bằng chương trình, nhưng để đơn giản bớt, dùng Paint tạo một hình trắng 24 bit 40x33 có kích thước vùng dữ liệu hơi lớn hơn file zip (file 4014 bytes, trừ Header 54 bytes, còn 3960 bytes). Sau đó, chép đè nội dung file zip lên nội dung phần dữ liệu BMP (tức là từ byte thứ 55). Để tránh quên, mình dùng 4 bytes dự trữ của phần FileHeader (các bytes thứ 7 đến thứ 10) để ghi kích thước file zip (giá trị Long). Việc lấy file zip ra (khi mọi thứ được nói trước thế này) chắc là quá đơn giản ? Bạn làm bài tập này đi, phần thưởng chính là Project kia ! File “ảnh” BMP dưới đây.
Chú ý: nếu bạn sử dụng phương pháp này để giấu thư tình thì nên mã hoá file zip, và nữa, đừng chấm phá trên nền trắng để làm giả BMP…giả rồi hù doạ người khác nhé !
Nếu không vì lý do kích thước, mình tạo file ảnh có độ rộng 1318 điểm, thí 1 line dưới cùng của nó đủ chứa 3954 bytes của cả file zip ! Có phải vì thế mà Admin không cho kèm file BMP ?
file_BMP.zip
File BMP xấu xí
(3.78 KiB) Đã tải 972 lần


Không mua hàng tiêu dùng của Trung Quốc, Đài Loan

phamtrantuan
Bài viết: 1
Ngày tham gia: T.Bảy 31/01/2009 3:12 pm

Re: Dữ liệu bitmap trong file BMP

Gửi bàigửi bởi phamtrantuan » T.Sáu 01/05/2009 12:44 am

Biết được cấu trúc file thì có viết được phần mềm mở file không ạ

Hình đại diện của người dùng
ledoninh
VIP
VIP
Bài viết: 38
Ngày tham gia: T.Sáu 26/08/2005 3:52 pm
Đến từ: HCMC
Has thanked: 1 time
Liên hệ:

Re: Dữ liệu bitmap trong file BMP

Gửi bàigửi bởi ledoninh » T.Hai 04/05/2009 4:41 pm

phamtrantuan đã viết:Biết được cấu trúc file thì có viết được phần mềm mở file không ạ

Các thành viên caulacbovb đã giới thiệu nhiều sản phẩm xử lý ảnh, lợi dụng file ảnh, tức là mở file được là đương nhiên. Mình không hiểu ý bạn !
---
to admin: Admin rục rịch hủy bỏ diễn đàn cũ hay sao vậy ?
Không mua hàng tiêu dùng của Trung Quốc, Đài Loan

Hình đại diện của người dùng
NoBi
Quản trị
Quản trị
Bài viết: 944
Ngày tham gia: T.Ba 18/03/2008 1:22 pm
Đến từ: Sài Gòn
Has thanked: 50 time
Been thanked: 64 time
Liên hệ:

Re: Dữ liệu bitmap trong file BMP

Gửi bàigửi bởi NoBi » T.Hai 04/05/2009 6:03 pm

Chắc cũng phải còn lâu lắm mới bỏ được. Em đang chuẩn bị chuyển diễn đàn cũ qua chung với diễn đàn này thôi.
:>


Quay về “Bài viết hướng dẫn”

Đang trực tuyến

Đang xem chuyên mục này: Không có thành viên nào trực tuyến.0 khách