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

Chia sẻ bởi:hands
★★★★★
Quảng cáo

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

Ý anh là băm hình ra mã đó hả

Đúng rồi, làm thế nào từ một tấm hình bất kỳ mình sẽ tạo ra dãy số như trong file.

Nếu tôi không lầm thì đây là Convert Image to Hex.
Trong Access có 1 kiểu Data Type là BLOB (Binary Large Object) dùng để lưu file ảnh thành dạng này. Trong SQL Server cũng vậy và có thêm dạng varbinary cũng để lưu file ảnh. Đối với Access hay SQL Server thì phần lớn mọi người không muốn lưu file ảnh chung với CSDL vì sẽ làm CSDL nặng lên rất nhiều, do vậy Access thì sẽ tách ra lưu Folder ảnh riêng còn SQL Server thì không làm như Access được nhưng cũng tách ra một file .mdf riêng chi chỉ để lưu file ảnh.
Trong Excel thì bác lại muốn chuyển đổi thành dạng này để lưu. Bác tìm các hàm Image to Hex trên mạng cũng có chia sẻ đó bác.
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.
2120
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.
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.
Giải quyết cái vụ này hay nè, khỏi mất công mang kèm file hình theo file Excel. Chúng ta sẽ làm các hàm sau:
1. Read từ 1 file user yêu cầu lên memory, bytes buffer, convert sang hex string, ghi xuống 1 cell
2. Read hex string từ 1 cell, convert ngược lại thành byte buffer, convert thành 1 Picture,để có thể gán cho cái gì đó mà chứa picture được
3. Read hex string từ 1 cell, convert ngược lại thành byte buffer, ghi xuống file user yêu cầu.
Cái 2 thì phải mò rồi, để xem IPicture, StdPicture có hàm "un đồ cú mần" giấu ở đâu không thôi, dùng luôn cho phẻ 🙂

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 🙂

Muốn lắm nhưng ko biết bắt đầu từ đâu, làm sao, như thế lào !!!???

Hì hì, không bạn. Ở đây không liên quan gì tới Đeo Phai hay DLL gì cả. Code VBA thôi. Trước mắt các bạn code 2 hàm 1 và 3 đi. Tốc độ tính sau, dù biết chắc chắn sẽ chậm với file lớn cỡ 1, 2 MB rồi. Cần thì mới optimize code VBA hay dùng API hoặc tệ nhất là dùng Dll.
Còn vấn đề 2 thì mình vừa hỏi ông Google, thiên hạ làm đầy rồi, chỉ copy về test, dùng thôi.
Mình post ở đây để các bạn tham khảo, dùng:
1. stackoverflow.com/questions/26442660/loading-a-picturebox-image-from-a-byte-array-in-vb6
2. groups.google.com/forum/m/#!topic/microsoft.public.vb.general.discussion/F057yLyA_Lk
3. bytes.com/topic/access/answers/204355-picturedata-stdpicture
Nôm na là đều quay quanh hàm API CreateStreamOnHGlobal và OleLoadPicture cả.

Chúc các bạn làm tốt. Vì mình cứ thấy API với VB/VBA là mình ghét à :p

Với chủ thớt
Put có thể ghi toàn bộ mảng bai, không phải ghi từng bai.
Nếu muốn dùng API thì vd. CreateFile, WriteFile …
————–
Dân văn phòng nhiều khi muốn làm những việc mà để làm được nó thì phải dùng API. Thì cứ xem các bài đăng trên GPE thì thấy là nhiều dân văn phòng có những yêu cầu kiểu đó. Vậy dùng API ở đây là bắt buộc, là do nhu cầu. Còn chưa thấy dân văn phòng nào có nhu cầu đếm thời gian cỡ ms. Có chăng thì chỉ là số đếm trên đầu ngón tay của 1 bàn tay. Một bên là bắt buộc do nhu cầu, một bên không là bắt buộc do nhu cầu văn phòng. ̣Không hiểu được người ta nói gì thì đừng có nói bừa.
————–
Tiêu đề

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

Đọc tiêu đề tôi có cảm giác là bạn có 1 hình trên sheet. Bây giờ bạn muốn tạo một chuỗi bai từ hình đó.
Đọc nội dung

để 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 đó

lại có cảm giác là bạn đã có 1 chuỗi bai trên sheet (cell) và bạn muốn tạo từ chuỗi bai đó 1 hình ảnh.

Rõ ràng 2 việc này là khác nhau, ngược nhau. Vậy mục đích của bạn là gì? Nếu bạn có 1 hình mà không muốn đính kèm theo tập tin Excel ở dạng tập tin ngoài thì load nó vào Shape, Image thôi chứ khó khăn gì? Rồi nếu cần thì tạo IPicture (IPictureDisp) từ ảnh lưu đó. Code tạo IPicture (IPictureDisp) thì đã có đầy trên GPE (trên internet) từ bao lâu rồi. Đâu phải chờ tới bây giờ mới có người mở mang đầu óc?

Vấn đề kieu manh nói là vấn đề cụ thể. Không hiểu người ta muốn gì, giả thiết ra sao thì ngồi im mà nghe.

Vấn đề kieu manh nói là: tôi có một chuỗi bai. Làm thế nào để "lưu" chuỗi bai đó vào tập tin Excel để khi cần thì tôi có lại chuỗi bai ban đầu, với mục đích dùng chuỗi bai đó cho một việc gì đó.

Thực chất mọi tập tin chẳng qua là một chuỗi bai dài ghi trên đĩa. Tôi muốn "lưu" một tập tin bất kỳ – txt, pdf, doc, jpg, bmp, avi, exe, dll, ocx … (nói cho cùng chỉ là những chuỗi bai dài dằng dặc) vào Excel để sau đó lúc cần thì dùng. Cái này thì dễ thôi. Ghi mảng bai vào cell ở dạng chuỗi hex. Nhưng cell có giới hạn số ký tự nên để ghi vd. AVI > 3 MB tôi phải dùng > 100 cell.

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.

Tất nhiên mỗi người có 1 cách của mình. Cách của tôi là vậy.

Mà cần gì nói nhiều. Tôi có tập tin hichic.wmv. Có thể ghi trực tiếp nội dung – chuỗi bai của hichic.wmv ở dạng chuỗi hex trong 1 hoặc rất nhiều cell. Giả sử ngoài cách này, tức không ghi vào 100 cell, thì còn cách nào không. Cách của tôi là một cách để "lưu" chuỗi bai ở dạng bitmap trong Image. Không hiểu người ta định làm gì, giả thiết ra sao thì đừng nói.

làm được cái này thì tìm hiểu sơ về cấu trúc file bmp
www.stdio.vn/articles/bitmap-khai-niem-va-cac-xu-ly-co-ban-523
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 !

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.

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.

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.

www.giaiphapexcel.com/diendan/threads/c%C3%A1ch-t%E1%BA%A1o-d%C3%A3y-s%E1%BB%91-t%E1%BB%AB-h%C3%ACnh-%E1%BA%A3nh.144120/page-2#posts

Khóa học Power PI – Ứng dung trong Nhân sự
Khóa học SprinGO phù hợp

Khóa học Power PI – Ứng dung trong Nhân sự

TỔNG QUAN KHÓA HỌC: POWER BI CHO NGÀNH NHÂN SỰ Khóa học Power BI cho Nhân sự được thiết kế dành riêng cho các...

Xem khóa học
★★★★★ 5 ★ 1 👤 1 ▥ 0
Quảng cáo

Bạn nên đọc

Bình luận

Quảng cáo

Cũ vẫn chất

Xem thêm