Cách tạo dãy số từ hình ảnh

batman1

Thành viên gạo cội
Tham gia ngày
8 Tháng chín 2014
Bài viết
3,569
Được thích
5,458
Điểm
560
Vấn đề kieu manh nói là vấn đề cụ thể.
...
Vấn đề kieu manh nói là: ...
...
Cách tôi đề nghị với kieu manh là ghi chuỗi bai vào Image. Thực ra nếu tập tin cần "lưu" vào Excel là ảnh thì load nó vào Image thôi. Nhưng trong vấn đề tôi nói với kieu manh thì chuỗi bai kia có thể là chuỗi bai đọc từ tập tin bất kỳ - txt, pdf, doc, avi, exe, dll, ocx ... Mà các tập tin này thì rõ ràng không load được vào Shape, Image bằng vài click chuột đơn giản được (vd. Insert -> Shapes -> Rectangle -> phải chuột -> Format shape -> Fill -> Picture or texture fill -> chọn ảnh). Và với các tập tin đó thì tôi đề nghị cách "lưu" chúng vào Image, và cách đọc lại chuỗi bai ban đầu. Với cách tôi giới thiệu cho kieu manh thì vd. tôi đọc chuỗi bai nội dung của tập tin hichic.wmv và "lưu" nó vào Image. Sau đó khi cần thì tôi lấy lại chuỗi bai ban đầu và ghi trên đĩa ở máy hiện hành thành xyz.wmv -> chiếu clip WMV cho "đối tác" xem -> xóa tập tin xyz.wmv.
Kiểm tra lại thấy kieu manh đã xóa nội dung bài nên những dòng mình viết trở thành vô duyên. Nhưng thôi kệ, cứ để đấy. Vì người ta hiểu sai cái DLL trong nội dung bài của kieu manh.
 

Kiều Mạnh

Thành viên gạo cội
Tham gia ngày
9 Tháng sáu 2012
Bài viết
4,221
Được thích
2,931
Điểm
560
Nơi ở
IIIIIIIIIIIIIIIII
Kiểm tra lại thấy kieu manh đã xóa nội dung bài nên những dòng mình viết trở thành vô duyên. Nhưng thôi kệ, cứ để đấy. Vì người ta hiểu sai cái DLL trong nội dung bài của kieu manh.
EM HIỂU MÀ ANH ... Thôi kệ đi ... Em cũng có một chút trong đó có nhắc tới Anh nên mới gây ra hiểu lộn như thế !!
Thôi bỏ đi nha Anh -0-0-0-

Link bài 26 Ai coi được gì thì coi ... ứng dụng được gì thì làm tùy vào khả năng của từng người

 

giaiphap

==(^o^)==
Tham gia ngày
12 Tháng ba 2007
Bài viết
5,238
Được thích
4,876
Điểm
860
Vụ bẻ khóa VBA hay dùng phần mềm HxD đó anh.
Anh mở HxD lên, kéo thả cái ảnh vào đó là có dãy số kia luôn.

View attachment 222545

Trường hợp ngược lại, từ HxD tạo một cửa sổ mới, chép dãy số đó vào và lưu lại thành một file.jpg (*.bmp,..) là được một bức ảnh.
Đúng cái mình cần. Nhưng có đoạn code để thực hiện việc này không cần copy thì ngon hơn,
Bài đã được tự động gộp:

Giờ mình mới download file của chủ thớt và xem code. Code chậm và có lỗi. Nếu chủ thớt dùng lại cho yêu cầu của mình thì cần fix và cải tiến nhiều
1. Dùng Open statement: Văng khi gặp path file có dấu
2. Put từng byte, rất chậm. Thao tác với I/O nên dùng buffer dập xuống, càng lớn càng tốt, dập 1 lần thôi, size buf nên là bội của 512 hay 1024.
3. Phân cách hex string = | không tốt.
Và có cái mình mới phát hiện là trên VBA và Excel, IPicture và StdPicture không support load image from memory. Cái này lại phải dùng API với con bò kéo xe "Vớ Bở À" rồi
Chủ thớt dùng code này phải lưu xuống và đọc lên ngược lại từ file thôi. Chia buồm :)
Anh xuất chiêu cho anh em học hỏi.
 

thuyyeu99

Trùm Nhiều Chuyện
Tham gia ngày
6 Tháng sáu 2008
Bài viết
1,577
Được thích
735
Điểm
860
Cái ý tưởng này em nghĩ em co thể mò được. tuy nhiên cái góp ý của anh @batman1 em thấy đúng ah. Liệu luu vào cell có ổn không hay ý anh là làm cái gì khác
 

anhtuanle123

Thành viên thường trực
Tham gia ngày
8 Tháng sáu 2009
Bài viết
302
Được thích
167
Điểm
695
Tuổi
35
Tôi có tham khảo cách mà người ta tạo ra file hình bằng những con số liên tục trong một danh sách (như file bên dưới). Vậy các anh (chị) cho tôi hỏi làm cách nào mà từ một hình ảnh tôi có thể tạo được một danh sách các số như ô A1 trong file dưới. Mục đích là để từ một ảnh bất kỳ tôi có thể đưa nó sang một danh sách số như trong file để sang máy khác tôi sẽ dùng code của file dưới để chuyển danh sách số này sang lại file hình trên máy đó (tránh trường hợp khi người dùng copy sẽ làm mất file hình kèm theo).
làm được cái này thì tìm hiểu sơ về cấu trúc file bmp
khoảng mấy chục byte đầu của file lưu mấy thông tin cơ bản chiều dài , chiều rộng !
căn cứ vào đó mình sẽ tính ra kích thước bức ảnh , 1 điểm màu pixel sẽ gồm 3 byte của 3 màu cơ bản RGB
cơ mà ảnh =bmp thì lưu =excel hay file hình thì đều tốn dung lượng , nếu biết thuật toán nén hình của file jpg thì data mới nhẹ được !
 

batman1

Thành viên gạo cội
Tham gia ngày
8 Tháng chín 2014
Bài viết
3,569
Được thích
5,458
Điểm
560
khoảng mấy chục byte đầu của file lưu mấy thông tin cơ bản chiều dài , chiều rộng !
căn cứ vào đó mình sẽ tính ra kích thước bức ảnh , 1 điểm màu pixel sẽ gồm 3 byte của 3 màu cơ bản RGB
cơ mà ảnh =bmp thì lưu =excel hay file hình thì đều tốn dung lượng
Không hẳn đơn giản như thế.
Format 24 bit là đơn giản nhất vì cứ 3 bai biểu diễn 1 pixel. Nhưng nếu là bitmap trắng đen thì chỉ cần 1 bit để ghi 1 pixel (bit = 0 thì pixel là đen, bit = 1 thì pixel là trắng). Tức 1 bai ghi được thông tin của 8 pixel.. Tức để ghi nhớ 1 ảnh có cùng 2 chiều w, h thì ảnh 24 bit dùng số bai gấp 24 lần. Nhưng nếu dùng format 1 bit thì phải đọc ra các bai rồi thực hiện các thao tác bit mới có mầu (trắng đen) của pixel có tọa độ bất kỳ x, y. Trái lại format 24 thì dùng tốn bai nhưng cứ 3 bai liền nhau là biểu diễn 3 thành phần B, R, G của 1 pixel, không đòi hỏi các thao tác bit.. Format 4, 8, 16 bit thì thao tác bit còn "rách việc" hơn nữa. Tóm lại lợi cái này thì "rắc rối" cái kia.

Trong code của mình tôi chọn format 24 bit vì thao tác đơn giản nhất.
Nhưng đúng là muốn tự đọc ra các thông tin của bitmap thì phải hiểu tường tận cấu trúc của bitmap.
 

anhtuanle123

Thành viên thường trực
Tham gia ngày
8 Tháng sáu 2009
Bài viết
302
Được thích
167
Điểm
695
Tuổi
35
load thử tấm hình lên cell của Excel !
bỏ 54 byte header của hình , còn lại là data !
hình chuẩn 3 màu 24 byte ,
chọn mãi mới đc tấm hình vừa ý ^^
 

File đính kèm

anhtuanle123

Thành viên thường trực
Tham gia ngày
8 Tháng sáu 2009
Bài viết
302
Được thích
167
Điểm
695
Tuổi
35
sản phẩm mang tính chất mộc mạc , chân phương , chủ yếu để tìm hiểu cấu trúc của ảnh bmp thôi bác , lộn ngược là do bản chất nó vốn thế ^^
còn để xử lý cho nhanh thì chắc phải thêm mấy kỹ thuật về bộ nhớ và tô màu nữa , vậy thì code sẽ phức tạp thêm @@
 

batman1

Thành viên gạo cội
Tham gia ngày
8 Tháng chín 2014
Bài viết
3,569
Được thích
5,458
Điểm
560
lộn ngược là do bản chất nó vốn thế ^^
Chứng tỏ là bạn chưa hiểu rõ hết về cấu trúc tập tin BMP.

Không phải bản chất nó thế. Nếu gọi là bản chất thì BMP có 2 bản chất.

Có 2 cách ghi các dòng bai mầu trong tập tin BMP.

Cách 1. Thường dùng nhất, để hình dung ta tạm cho là trong 99,99% các trường hợp.
Trong trường hợp này biHeight trong cấu trúc BitmapInfoHeader được thiết lập là số DƯƠNG. Hàm ý là gốc tọa độ là góc dưới bên trái của màn hình - lower left corner (trục y hướng lên trên), và các dòng bai mầu được ghi trong tập tin BMP theo thứ tự: trước tiên ghi dòng cuối cùng, sau đó là dòng trước dòng cuối cùng, ..., dòng sau dòng đầu, dòng đầu. Đó chính là bottom-up DIB.

1.JPG


Tập tin BMP của bạn ở dạng này: biHeight = 183 = B7 (hex) - DƯƠNG. Trong tập tin BMP của bạn đó là 4 bai từ bai 22 tới bai 25 (offset tính từ 0) - trên bảng tính là B23:B26. Giá trị Long (VBA) - DWORD (Windows) &H000000B7 = 183 chính là số dòng trong bitmap của bạn (400 x 183).

Cách 2. biHeight là số ÂM, gốc tọa độ là góc trên bên trái (upper left corner - trục y hướng xuống dưới), các dòng bai mầu được ghi theo thứ tự ngược lại, tức: trước tiên dòng đầu, tiếp theo dòng sau dòng đầu, ..., dòng trước cuối, dòng cuối (top-down).

Do tập tin của bạn thuộc cách 1 (các dòng bai mầu được ghi trong BMP theo bottom-up) nên khi đọc ra để ghi vào sheet bạn phải ghi theo thứ tự: ghi dòng bai mầu đầu tiên đọc từ tập tin BMP (dòng cuối cùng của ảnh) vào vd. dòng 183 của sheet, dòng thứ 2 đọc từ tập tin BMP (dòng trước cuối của ảnh) vào dòng 182 của sheet, ...., dòng trước cuối đọc từ tập tin BMP (dòng 2 của ảnh) vào dòng 2 của sheet, dòng cuối cùng đọc từ tập tin BMP (dòng đầu của ảnh) vào dòng 1 của sheet. Lúc đó ảnh sẽ không bị ngược.

Lưu ý: Về đọc các dòng bai mầu từ tập tin BMP.

2.JPG

Trong trường hợp tổng quát khi tạo tập tin BMP 24 bit thì mỗi pixel được biểu diễn bởi 3 bai liên tiếp (các thành phần B, G, R của pixel - xem hình 2). Như vậy với BMP có w pixel theo hàng ngang thì mỗi dòng bai mầu được biểu diễn bằng 3*w bai. Nhưng nếu 3*w không là bội của 4 thì 1, 2 hoặc 3 bai 0 sẽ được thêm vào cuối mỗi dòng bai mầu (xem hình 2) để sao cho mỗi dòng bai mầu có số bai là bội của 4. Vd. w = 11 thì không phải 3*11 = 33 bai sẽ được ghi vào mỗi dòng mầu khi tạo BMP. Lúc đó sẽ được ghi 33 bai mầu của dòng + 3 bai 0:

Vd. với bottom-up:

<33 bai màu của dòng cuối><3 bai 0><33 bai mầu của dòng trước cuối><3 bai 0> ... <33 bai mầu của dòng đầu tiên><3 bai 0>

Trong trường hợp trên để chấm mầu trên sheet thì khi đọc ra các bai cho từng dòng thì chỉ đọc 33 bai (3*biWidth), và trước khi đọc dòng mới thì phải nhẩy bỏ qua 3 bai 0.

Trong trường hợp của bạn w = 400. Mỗi dòng mầu được biểu diễn bằng 3*400 = 1200 bai. 1200 là bội của 4 nên khi tập tin BMP được tạo thì không có bai 0 nào được thêm, được chèn giữa các dòng mầu. Vì thế đọc và lấy các bai như bạn là được. Nhưng trong trường hợp tổng quát phải đọc ra biWidth để kiểm tra xem 3*biWidth có là bội của 4 không. Nếu không thì tính được số bai 0 được thêm vào mỗi dòng bai mầu. Và khi đọc ra để chấm mầu trên sheet thì phải bỏ qua các bai 0 này - đọc ra 3*biHeight bai -> bỏ qua các bai 0 nếu có -> đọc tiếp 3*biHeight bai -> bỏ qua các bai 0 nếu có ...

Đấy là nói về format 24 bit. Còn với các format khác thì khi đọc ra bai còn phải thực hiện thao tác bit để biết được pixel (x, y) có mầu thế nào.
 

anhtuanle123

Thành viên thường trực
Tham gia ngày
8 Tháng sáu 2009
Bài viết
302
Được thích
167
Điểm
695
Tuổi
35
Trong trường hợp của bạn w = 400. Mỗi dòng mầu được biểu diễn bằng 3*400 = 1200 bai. 1200 là bội của 4 nên khi tập tin BMP được tạo thì không có bai 0 nào được thêm, được chèn giữa các dòng mầu. Vì thế đọc và lấy các bai như bạn là được. Nhưng trong trường hợp tổng quát phải đọc ra biWidth để kiểm tra xem 3*biWidth có là bội của 4 không. Nếu không thì tính được số bai 0 được thêm vào mỗi dòng bai mầu. Và khi đọc ra để chấm mầu trên sheet thì phải bỏ qua các bai 0 này - đọc ra 3*biHeight bai -> bỏ qua các bai 0 nếu có -> đọc tiếp 3*biHeight bai -> bỏ qua các bai 0 nếu có ...

Đấy là nói về format 24 bit. Còn với các format khác thì khi đọc ra bai còn phải thực hiện thao tác bit để biết được pixel (x, y) có mầu thế nào.
thank bác batman đã bỏ công nghiên cứu và thu thập tài liệu , kiến thức , quả thật là trước đây còn rảnh rỗi vọc vạch cách load ảnh , em cũng không hiểu sao có ảnh thì load ngon lành , có ảnh thì căn chỉnh kiểu gì cũng bị lệch , chắc là do nguyên nhân này rùi , cũng tại do chụp giựt không nghiên cứu đến nơi về header mà chỉ quan tâm đến phân giải của bức ảnh , thôi để xem có bạn nào cải tiến hành công cụ hoàn chỉnh ko , sau việc đọc hình này có dịp nhờ bác nghiên cứu file âm thanh nha ^^

Máy bạn @giaiphap mạnh dữ vậy ne ? Máy tui thì đơ luôn :)
bác thử cắt bức ảnh giảm phân giải xuống còn 200x200 sem ^^

Hay quá bạn ơi, chạy ngon.
mình nghĩ là load lên được từng pixel thì chắc cũng khá nhiều ứng dụng
và phải cải tiến code sao cho bấm phát ra luôn mới ăn tiền đc !^^
 

HeSanbi

Thành viên tích cực
Tham gia ngày
24 Tháng hai 2013
Bài viết
1,573
Được thích
1,792
Điểm
560
Bác thử file này xem có gì hay hơn việc load vào Cell, thay vào đó nó load luôn vào Module.
Và load bất kỳ file nào đọc được.
 

File đính kèm

batman1

Thành viên gạo cội
Tham gia ngày
8 Tháng chín 2014
Bài viết
3,569
Được thích
5,458
Điểm
560

ThangCuAnh

Mới rờ Ét xeo
Tham gia ngày
1 Tháng mười hai 2017
Bài viết
845
Được thích
709
Điểm
360
Nơi ở
Phờ lây cu
Chủ đề này bị chìm xuồng uổng nhỉ. Bác giaiphap đã làm được hay có giải pháp gì chưa ? Bác Ông kẹ có code cho bên Access của bác chưa ?
Mình mấy nay bận quá nên chưa tiếp được. Đụng phải giới hạn của VBA trong vụ convert từ byte buffer sang Hex string và ngược lại, quá chậm, nản tính bỏ rồi.
May nhờ thấy cái tiêu đề file của bạn Heshanbi, base64, mới sực nhớ lại với nó. Hồi xưa làm nó nát rồi mà, trong mấy project về MIME format, parse nội dung mail, get attached files. Nên quay lại.
Hì hì, vẫn đụng đầu, code VBA cho base64 chạy quá chậm. Dù đã optimize code VBA cho cả 2 hex và base64 đủ cách
Lục lại code C hồi xưa,build dll, test thử, nhanh hơn cả hex và base64 của VBA gần 30, 40 lần, nhưng không lý lại đi đâu phải mang cái dll made in Thang Cu Anh đi theo ? :)
Test với cái MSXML COM Ojbect của MS như trong file bạn Heshanbi đi kèm thì thất vọng, nó chỉ nhanh hơn có 3 lần, mà lại overhead quá nhiều. Bỏ luôn.
 
Lần chỉnh sửa cuối:

giaiphap

==(^o^)==
Tham gia ngày
12 Tháng ba 2007
Bài viết
5,238
Được thích
4,876
Điểm
860
Chủ đề này bị chìm xuồng uổng nhỉ. Bác giaiphap đã làm được hay có giải pháp gì chưa ? Bác Ông kẹ có code cho bên Access của bác chưa ?
Mình mấy nay bận quá nên chưa tiếp được. Đụng phải giới hạn của VBA trong vụ convert từ byte buffer sang Hex string và ngược lại, quá chậm, nản tính bỏ rồi.
May nhờ thấy cái tiêu đề file của bạn Heshanbi, base64, mới sực nhớ lại với nó. Hồi xưa làm nó nát rồi mà, trong mấy project về MIME format, parse nội dung mail, get attached files. Nên quay lại.
Hì hì, vẫn đụng đầu, code VBA cho base64 chạy quá chậm. Dù đã optimize code VBA cho cả 2 hex và base64 đủ cách
Lục lại code C hồi xưa,build dll, test thử, nhanh hơn cả hex và base64 của VBA gần 30, 40 lần, nhưng không lý lại đi đâu phải mang cái dll made in Thang Cu Anh đi theo ? :)
Test với cái MSXML COM Ojbect của MS như trong file bạn Heshanbi đi kèm thì thất vọng, nó chỉ nhanh hơn có 3 lần, mà lại overhead quá nhiều. Bỏ luôn.
Thật ra mục đích của tôi chỉ lấy mã số Hex của file ảnh thôi, mà bạn @anhtuanle123 đã giúp, còn việc tốc độ chậm đối với tôi không cần thiết, vì file tôi có kích thước nhỏ vã lại không cần lấy màu để tô vào sheet nên tốc độ vậy là quá tốt rồi.
 

ongke0711

Thành viên tiêu biểu
Tham gia ngày
7 Tháng chín 2006
Bài viết
734
Được thích
839
Điểm
860
Nơi ở
HCM
Chủ đề này bị chìm xuồng uổng nhỉ. Bác giaiphap đã làm được hay có giải pháp gì chưa ? Bác Ông kẹ có code cho bên Access của bác chưa ?
Mình mấy nay bận quá nên chưa tiếp được. Đụng phải giới hạn của VBA trong vụ convert từ byte buffer sang Hex string và ngược lại, quá chậm, nản tính bỏ rồi.
:) Thực ra mấy cái ứng dụng nho nhỏ của tôi chỉ loanh quanh xử lý CSDL nhỏ, upload hình nhân viên, hình sản phẩm.., cũng chưa có nhu cầu bảo mật hình ảnh hoặc khác trong việc chuyển đổi Image sang Hex.
Đối với SQL Server database thì đúng là nó có lưu file ảnh ở dạng Binary - Field varbinary(Max). Khi đó thì tôi đang dùng ADODB để truy xuất dữ liệu từ FE Access nên sẽ dùng luôn ADODB.Stream để Read/Write file ảnh sang Binary luôn cho tiện. Tôi cũng có dùng hàm FreeFile và thấy tốc độ convert sang Binary cũng có nhanh hơn nhưng không đáng kể nên vẫn dùng cách cũ là ADODB. Stream
Mấy cách trên thì convert file ảnh dạng nào (jpg, png, bitmap) cũng được, file PDF cũng được.

222815

Riêng đối với CSDL back end là Access thì tôi vẫn chọn cách lưu folder ảnh riêng chứ không lưu vô CSDL Access (dạng Long Binary Data) để khỏi tốn dung lượng file.
Còn các ứng dụng khác áp dụng, khai thác việc convert ảnh sang Hex hoặc Binary thì cũng chưa làm tới nên cũng không biết gì mà bàn :) .
 
Lần chỉnh sửa cuối:
Top Bottom