Cách tạo dãy số từ hình ảnh (1 người xem)

  • Thread starter Thread starter giaiphap
  • Ngày gửi Ngày gửi
Liên hệ QC

Người dùng đang xem chủ đề này

giaiphap

==(^o^)==
Tham gia
12/3/07
Bài viết
5,809
Được thích
6,367
Donate (Momo)
Donate
Giới tính
Nam
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).
 

File đính kèm

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ả
 
Upvote 0
Đú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.
 
Upvote 0
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
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.

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.
 
Upvote 0
Chủ đề hay đấy bạn chủ thớt. Nhiều cái lý thú đấy.
 
Upvote 0
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 :)
 
Lần chỉnh sửa cuối:
Upvote 0
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, 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 cải tiến cho em học với (máy cái vụ API với memory .... em yếu lắm)


ps. Kiến thức anh rộng quá em theo không kịp :wallbash: :wallbash: :wallbash: :wallbash: :wallbash::wallbash:
 
Upvote 0
VBA "Vớ Bở À" dùng cho dân Văn phòng mà, biết mấy cái kia chi cho mệt, nhức đầu bé, xấu đi nữa. Không nghe mấy bác kia nói à :)
 
Lần chỉnh sửa cuối:
Upvote 0
VBA "Vớ Bở À" dùng cho dân Văn phòng mà, biết mấy cái kia chi cho mệt, nhức đầu bé. Không nghe mấy bác kia nói à :)
Công việc nhà của Bé sắp xong rồi nên Bé thích nhức đầu 1 chúc và Bé thấy anh giải thích hay hay nên Bé cũng muốn mò Debug, OllyDbg, Api, Hook, Decompiler..... :kicking::kicking::kicking::kicking::kicking::kicking:
 
Upvote 0
Có ông già sư phụ, cái gì cũng biết đó bé, ổng tên Google, hỏi đúng là ổng quăng trả lời ra đọc mệt nghĩ luôn :)
 
Upvote 0
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ẻ :)
 
Upvote 0
đặt 1 Cục gạch lót dép ngồi Hóng ===\. -0-0-0-
 
Upvote 0
Bác Mạnh viết hàm 1 với 3 đi, đơn giản mà
 
Upvote 0
:p :p :p :p :p :p :p
 
Lần chỉnh sửa cuối:
Upvote 0
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. https://stackoverflow.com/questions/26442660/loading-a-picturebox-image-from-a-byte-array-in-vb6
2. https://groups.google.com/forum/m/#!topic/microsoft.public.vb.general.discussion/F057yLyA_Lk
3. https://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
 
Upvote 0
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ần chỉnh sửa cuối:
Upvote 0
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.
 
Upvote 0
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

 
Upvote 0
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.
 
Upvote 0
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
 
Upvote 0
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 !
 
Upvote 0
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.
 
Upvote 0
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

Upvote 0
Tội máy em quá bạn @anhtuanle123 ơi, file đã "nộn" ngược mà còn chạy treo Excel trên máy già em "nuôn"
 
Upvote 0
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 @@
 
Upvote 0
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.
 
Upvote 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.
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 !^^
 
Upvote 0
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

Upvote 0
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:
Upvote 0
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.
 
Upvote 0
Thế các dạng file ảnh khác chạy được kg 2 bạn?
 
Upvote 0
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:
Upvote 0
Thấy trong hình của @ongke0711 là 2 hình, hình 1 là BMP, hình 2 là JPEG. Vậy Access hổ trợ gán image trực tiếp từ 1 memory byte buffer hả bạn ?
 
Upvote 0
Thấy trong hình của @ongke0711 là 2 hình, hình 1 là BMP, hình 2 là JPEG. Vậy Access hổ trợ gán image trực tiếp từ 1 memory byte buffer hả bạn ?

Hình trên là table của SQL Server. Dùng ADODB.Stream để đọc file ảnh rồi mới dùng câu lệnh T-SQL lưu trực tiếp vào field của Table.
Còn Access thì không cần. Chỉ cần khai báo field là OLEObject và Access sẽ hỗ trợ nút lệnh "Insert Object" chèn thẳng vào field.
 
Upvote 0
Ý mình hỏi là đối tượng display image thì sao đó ông kẹ
 
Upvote 0
Ý mình hỏi là đối tượng display image thì sao đó ông kẹ
:) À. Vụ hiển thị ảnh trong Access Form thì vẫn phải đi đường vòng bác à. Tức là vẫn phải chuyển từ Binary sang file ảnh và lưu vào folder tạm, sau đó lấy đường dẫn đó gán cho Image control trên Form Access.
Công nhận bác hay thật nhìn cái hình mã binary suy ra JPG, PNG luôn.

Mã:
adoCon.CursorLocation = 3  'adUseClient
    adoCon.Open "Network Library=DBMSSOCN;" & _
                "PROVIDER=SQLOLEDB;DATA SOURCE=localhost\QUOCBAO-PC,1433" & _
                ";INITIAL CATALOG=Test" & _
                ";User Id=sa;Password=123456;"

    adoRs.Open "SELECT MaNV,Hinh FROM tblPhoto WHERE MaNV = 2", adoCon, 3, 3

    adoStream.Type = 1    'adTypeBinary
    adoStream.Open
    adoStream.Write adoRs.Fields("Hinh").Value    ' Field luu binary data

    adoStream.SaveToFile "C:\" & adoRs.Fields("MaNV").Value & ".png", 2

    adoRs.Close
    adoCon.Close
 
Upvote 0
Hi hi, ruột là JPEG mà bác Ông Kẹ ép nó lưu xuống với đuôi png hen :) MaNV = 2 là JPEG, MaNV = 1 là bitmap, size = 0x00035A06 (219 654) bytes.
JPEG file thì bytes nhận dạng là = FF D8 FF E0, PNG file byte nhận dạng là 89 50 4E 47....
Hồi xưa mình làm bên multimedia, xử lý ảnh, video... mấy cái này làm nát luôn, giờ nhìn thấy là ngán mà. Nhất là ông BMP, sợ nó luôn :)
Lãnh vực forensics bây giờ phải nắm file format rất nhiều. Không biết gì thì cứ hỏi ông Google, ê cho tui xxx file format
 
Upvote 0
Hi hi, ruột là JPEG mà bác Ông Kẹ ép nó lưu xuống với đuôi png hen :) MaNV = 2 là JPEG, MaNV = 1 là bitmap, size = 0x00035A06 (219 654) bytes.
JPEG file thì bytes nhận dạng là = FF D8 FF E0, PNG file byte nhận dạng là 89 50 4E 47....
Hồi xưa mình làm bên multimedia, xử lý ảnh, video... mấy cái này làm nát luôn, giờ nhìn thấy là ngán mà. Nhất là ông BMP, sợ nó luôn :)
Lãnh vực forensics bây giờ phải nắm file format rất nhiều. Không biết gì thì cứ hỏi ông Google, ê cho tui xxx file format

Haha...đúng là làm biếng chút là bị bắt lỗi liền. Đúng ra là trong table còn có 1 field nữa tôi lưu [FileExtension] sau đó khi convert sẽ lấy đuôi đó ghép vô chứ không có ép như code demo.
 
Upvote 0
Không cần đâu field đó đâu bác Ông kẹ, cứ lưu đại xuống với đuôi gì cũng đươc, mọi chuyện file content là gì thì đã có Office "no". Nó sẽ tự detect được file format là gì và phải dùng parser gì
 
Upvote 0
Không cần đâu field đó đâu bác Ông kẹ, cứ lưu đại xuống với đuôi gì cũng đươc, mọi chuyện file content là gì thì đã có Office "no". Nó sẽ tự detect được file format là gì và phải dùng parser gì

Có trường hợp lưu file văn bản dạng .pdf và .doc nữa bác à.
 
Upvote 0
À, thế thì phải thêm field đó rồi. 2 file type khác. Sorry ông kẹ nhen :)
File Office cũ thì luôn là D0 CF 11 E0 ở đầu file. Coder MS code cố tình chọn 4 byte đó, đó là DocFile đó các bạn, nhìn thấy không
Tui cũng hay dùng 0x0BADC0DE (bad code) đễ đánh dấu memory đít và đầu để detect bị dập memory.
File pdf thì 0x25 50 44 46 (%PDF) ở đầu. File Office mới bây giờ thì Zip format, 0x50 4B (PK) đầu tiên.

Các ct forensics, khôi phục file trên đĩa luôn luôn nhận dạng loại file dựa vào các bytes nhận dạng này để rút trích ngược lại file.

Cứ download HxD và mở ra sẽ thấy, coi như biết thêm cho vui :)
Hex editor miễn phí và mạnh thì chỉ có HxD là số 1, được viết = Delphi nhé, các bác download tại chính gốc đây:

Còn trình zip thì bà con đừng dùng WinRAR, lỗi bảo mật nhiều lắm, bị hacker khai thác nhiều. Cứ 7zip free mà dùng, internal viewer của nó support rất nhiều file format độc như PE, msi, các trình setup...
 
Lần chỉnh sửa cuối:
Upvote 0
Vậy là Ông Kẹ không cần fied FileExtension nữa nhen, cứ đọc 4 byte đầu của stream lên rồi detect format.
Còn có việc phải nhờ Ong Kẹ test đấy
Mã:
#If USE_FOR_ACCESS Then     ' Dành riêng cho Ông Ke

Public Property Get aeArrayFromPicture(ByVal objPic As StdPicture, ByVal pic As aePicFileType) As Byte()
    aeArrayFromPicture = ArrayFromPicture(objPic, pic)
End Property

Public Property Get aeResampleGDIP(ByVal Image As StdPicture, ByVal Width As Long, ByVal Height As Long) As StdPicture
    Set aeResampleGDIP = ResampleGDIP(Image, Width, Height)
End Property

Public Property Get aeLoadPictureGDIP(ByVal sFileName As String) As StdPicture
    Set aeLoadPictureGDIP = LoadPictureGDIP(sFileName)
End Property

Public Property Get aeAttachmentToPicture(ByVal strTable As String, ByVal strAttachmentField As String, ByVal strImage As String) As StdPicture
    Set aeAttachmentToPicture = AttachmentToPicture(strTable, strAttachmentField, strImage)
End Property

Public Property Get aeOLEFieldToPicture(ByVal strTable As String, ByVal strNameField As String, ByVal strName As String, ByVal strOLEField As String) As StdPicture
    Set aeOLEFieldToPicture = OLEFieldToPicture(strTable, strNameField, strName, strOLEField)
End Property

' Create a picture object from an OLE Field (BLOB, long binary)
' strTable:              Table containing OLE field with picture contents
' strNameField:          Name field to identify record
' strName:               Unique name of the picture in Name field
' strOLEField:           Name of OLE field in table
' ? OLEFieldToPicture("tblOLE","ImageName","cloudy","Blob").Width
Private Function OLEFieldToPicture(ByVal strTable As String, _
                                  ByVal strNameField As String, _
                                  ByVal strName As String, _
                                  ByVal strOLEField As String) As StdPicture
    Dim rst As ado.Recordset
    Set rst = CurrentDb.OpenRecordset("SELECT " & strOLEField & " FROM " & strTable & " WHERE " & strNameField & "='" & strName & "'", dbOpenDynaset)

    If Not rst.EOF Then
        Set OLEFieldToPicture = ArrayToPicture(rst(strOLEField).Value)
    End If
    
    rst.Close
    Set rst = Nothing
End Function

' Create a picture object from an Access 2007 attachment
' strTable:              Table containing picture file attachments
' strAttachmentField:    Name of the attachment column in the table
' strImage:              Name of the image to search in the attachment records
' ? AttachmentToPicture("ribbonimages","imageblob","cloudy.png").Width
Private Function AttachmentToPicture(ByVal strTable As String, ByVal strAttachmentField As String, ByVal strImage As String) As StdPicture
    Dim strSQL As String
    Dim bin() As Byte
    Dim nOffset As Long
    Dim nSize As Long

    strSQL = "SELECT " & strTable & "." & strAttachmentField & ".FileData AS data " & _
             "FROM " & strTable & _
             " WHERE " & strTable & "." & strAttachmentField & ".FileName='" & strImage & "'"
    
    On Error Resume Next
    
    bin = DBEngine(0)(0).OpenRecordset(strSQL, dbOpenSnapshot)(0)
    If Err.Number = 0 Then
        Dim bin2() As Byte
        
        nOffset = bin(0)    ' First byte of Field2.FileData identifies offset to the file data block
        nSize = UBound(bin)
        ReDim bin2(nSize - nOffset)
        CopyMemory bin2(0), bin(nOffset), nSize - nOffset   ' Copy file into new byte array starting at nOffset
        
        Set AttachmentToPicture = ArrayToPicture(bin2)
        
        Erase bin2
        Erase bin
    End If
End Function

#End If     ' USE_FOR_ACCESS
 
Upvote 0
Vậy là Ông Kẹ không cần fied FileExtension nữa nhen, cứ đọc 4 byte đầu của stream lên rồi detect format.
Còn có việc phải nhờ Ong Kẹ test đấy

Mã:
#If USE_FOR_ACCESS Then     ' Dành riêng cho Ông Ke

Public Property Get aeArrayFromPicture(ByVal objPic As StdPicture, ByVal pic As aePicFileType) As Byte()
    aeArrayFromPicture = ArrayFromPicture(objPic, pic)
End Property

Public Property Get aeResampleGDIP(ByVal Image As StdPicture, ByVal Width As Long, ByVal Height As Long) As StdPicture
    Set aeResampleGDIP = ResampleGDIP(Image, Width, Height)
End Property

Public Property Get aeLoadPictureGDIP(ByVal sFileName As String) As StdPicture
    Set aeLoadPictureGDIP = LoadPictureGDIP(sFileName)
End Property

Public Property Get aeAttachmentToPicture(ByVal strTable As String, ByVal strAttachmentField As String, ByVal strImage As String) As StdPicture
    Set aeAttachmentToPicture = AttachmentToPicture(strTable, strAttachmentField, strImage)
End Property

Public Property Get aeOLEFieldToPicture(ByVal strTable As String, ByVal strNameField As String, ByVal strName As String, ByVal strOLEField As String) As StdPicture
    Set aeOLEFieldToPicture = OLEFieldToPicture(strTable, strNameField, strName, strOLEField)
End Property
...


#End If     ' USE_FOR_ACCESS

- Đưa vô file Access rồi đây bác.
- Code đưa còn thiếu mấy cái hàm: ArrayFromPicture, ResampleGDIP, LoadPictureGDIP
- Báo lỗi "Type mismatch" chỗ biến "bin2"
 

File đính kèm

Upvote 0
Hì hì, thôi để mình up đầy đủ lên đây cho Ông Kẹ với các bạn làm tiếp luôn, chứ nói thật tình là mình ngán mấy cái vụ xử lý ảnh với dùng API với VBA tới tận cổ luôn rồi. Không muốn, không có hứng làm chút nào. Làm 1 mình cũng ngán nữa.

Dùng API trên C# mình đã chữi um cái vụ khai báo với UnSafe của nó rồi huống chi VBA.
Mình chỉ dùng API với VC và Delphi thôi, cứ Pointer mà phang thôi, quen rồi. Hỏi bác Tuân thì biết.
Máy mình lại là Office 2007 nữa (VBE 6) nên làm xong phải port, test với VBE7 rồi Office64 nữa, nên "nười" quá bỏ luôn. Mà bỏ thì cũng uổng công đã tìm, port, gọt giũa, nên thôi up lên đây.

Bà con làm tiếp nhen, cơ bản trong file chúng ta đã có các hàm từ memory byte buffer to GDIPlus image và ngược lại. Có StdPicture rồi thì cứ get hay assign vào các đối tượng nào của Office support property StdPicture (IPicture).
Có byte buffer đó rồi các bác muốn làm, muốn chế sang Hex/Base64/xxx và ngược lại gì thì tùy các bác thêm mắm, thêm muối và nhu cầu sử dụng.

À quên, cứ image file format nào mà Excel mở được thì thư viện này mở được hết nhé, còn tại sao thì mình sẽ nói sau. Hồi sau sẽ rõ :)
Tốc độ thì các bác khỏi phải "no". API nó làm ở DLL viết = Visual C++ hết chứ VBA có làm cái gì đâu.
Bài đã được tự động gộp:

Tốt nhất là bác nào nắm được gọi API với VBA và đang có máy Win64 + Office64 ngồi port tiếp là tốt nhất. Win64 + Office64 mà chạy đúng thì Win32 + Office32 chắc chắn sẽ đúng, mà ngược lại thì không chắc nhen.
Có gì thét mét đừng ngại post lên trao đổi nhé các bác, cho nó xong vấn đề này cho rồi.
Mình thì bữa giờ kẹt với bác Tuân quá và không muốn làm cái này nữa.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Chổ USE_FOR_ACCESS mình phải bật False và chưa test, debug đó nhen ông kẹ, vì bật True thì khi compile VBA của Excel nó nhảy vào chửi mình, kekeke :)
Ông kẹ cứ bật True lên hay xóa nó đi trong môi trường Access của bạn nhé. Mình test trên Excel 2007 32bit là OK hết rồi đó.

Chổ CopyMemory bin2(0), bin(nOffset), nSize - nOffset, bên mình khai báo là ByVal xxx as Long/LongPtr nhé, nên ông kẹ chịu khó sữa thành sau nhé.
Mã:
CopyMemory VarPtr(bin2(0)), VarPtr(bin(nOffset)), nSize - nOffset
Mình ghét cái ông lanh chanh As Any của VB/VBA lắm, thích tường minh là số, là địa chỉ rõ ràng. ByRef thì không ưng lắm, nhưng phải xài thôi :)
 
Lần chỉnh sửa cuối:
Upvote 0
Không biết các bác @giaiphap, @ongke0711 port tới đâu rồi nhỉ, có làm tiếp hay không nhỉ, có kẹt, vướng mắc gì không ?

Về vụ File IO binary mode thì mình, như đã nói bên topic TextStream rồi, mình đã bo xì, nghĩ chơi VBA IO Funcs và TextStream, đã tìm ra giải pháp thay thế, dùng API của shlwapi.dll (Shell Lighweight API Library) của MS. Nó là các hàm IStream_xxx. shlwapi.dll này nói thật mình rất chi là "ưng cái bụng", hầu như cái gì cũng có cho những nhu cầu thông thường của mọi người. Và nó cũng được coder MS dùng rất nhiều trong các team, soft, component của họ. Ví dụ như ông Excel bà con đang chạy, nó cũng dùng dll này, ở dạng Delay Load (load trễ: kiểu trung gian giữa static link và dynamic call GetProcAddress). Khi trong code VBA bà con gọi nó thì sure 200% nó đã được load lên memory process của Excel.exe rồi. Nên VBDllFuncCall sẽ đở vất vã :)
Bên trong IStream_xxx, nó thao tác với API cấp thấp nhất, ntdll.dll API, nên cực nhanh và mạnh.
Các Object khác, phía trên của MS như ADO Stream, XML Stream... đều phải dùng, call tới các API này bên trong ruột.
Nhưng có 1 cái kẹt nhỏ xíu là nó viết ra với mục đích là dùng, để call cho/từ C++. Nó trả về và nhận vào pointer to IStream interface. Mà IStream interface thì VB/VBA không support, declare.
Nhưng không sao, 1 chút xíu tip, workaround nho nhỏ là mấy em nó phải ngoan ngoãn nghe lời, làm đúng theo anh VBA gọi à :)
Code VBA dùng, call IStream_Read/IStream_Write... không có trên Google đâu, chưa ai làm cả, bà con khỏi tìm mất công.
Bài đã được tự động gộp:

Về vụ Hex, Base64 thì các Dll của Windows không có thằng nào export ra hàm API nào để làm cả. Nên sau đó mình đã tìm trong các COM Object và đã tìm ra. Đó là capicom.dll. Dll của MS, luôn có với mọi version của Windows nhé, nên bà con an tâm. capicom = Crypto API COM Library. Phục vụ các tác vụ về mã hóa, crypto... tùm lum tùm la của MS. Trong CAPICOM có class Utilities, có các method làm các vụ Hex/Binary/Base64 này. Mình đã xem trong mã của nó và phải công nhận, nó code cực nhanh (MS coder siêu quá).
Bà con cứ add nó vào và tham khảo nhé. Trong References, Browse, nó nằm đầu tiên ở vần C đó. Cứ code các hàm nho nhỏ test các method của nó. Thích early bind thì add capicom.dll vào References, new CAPICOM.Utilities. Còn không muốn add Reference thì CreateObject("CAPICOM.Utilities").
Bài đã được tự động gộp:

Interface cho các bác code Delphi nó "như thế lày" đây :)
 

File đính kèm

  • 1.png
    1.png
    17.1 KB · Đọc: 27
  • 2.png
    2.png
    19.1 KB · Đọc: 27
  • 3.png
    3.png
    73.1 KB · Đọc: 26
Lần chỉnh sửa cuối:
Upvote 0
Nhờ các bác kiểm tra giúp, trên Win64,Office 64, mảng động dim arrB() as Byte có thể Redim tối đa được bao nhiêu phần tử ?
 
Upvote 0
Tiếp tục chủ đề các bạn ơi, chưa xong mà.
- Vụ byte array sang Image StdPicture và ngược lại chúng ta đã coi như xong. Chỉ còn chờ các bạn port và test thôi.
- Vụ từ byte array sang hex string và ngược lại thì chúng ta cũng đã xong, bên topic Undocument VBA. Tốc độ tạm tạm "ược" :)
Giờ chỉ còn vụ IO, vì chúng ta không dùng TextStream và Open statement của VBA được.
Tui code mình tui dùng thì không nói gì rồi, nhưng muốn share cho các bạn dùng sau này luôn, nên mới hỏi các bạn cần các tính năng nào của hàm.
Ví dụ tôi giờ chỉ thấy cần dùng 2 hàm tôi đặt tên là
FileBinary_ReadAll(strPath as string, arrData() as Byte) as Boolean: Read tất cả content của 1 file chỉ ra trong strPath vào arrData. 1 lần call duy nhất.
FileBinary_WriteAll(strPath as String, arrData() as Byte) as Boolean: Write, ghi đè toàn bộ nội dung file cũ của file chỉ bởi strPath bằng data trong arrData. 1 lần call duy nhất.
Vì strPath là string VBA Unicode giữ nguyên bản truyền xuống cho các API IStream_ nên các bạn không lo vụ file có dấu.
Và IStream_ support file cực bự, 2^64 byte trên cả Win32 và Win64, các bạn có cần đến không, hay chỉ cần trong phạm vi biến Long dương của VBA, 2GB thôi ?
Và các bạn cần hàm nào nữa để dùng sau này thì cứ liệt kê ra, mình viết 1 lần vào modUtils.pas cho sau này các bạn mang đi độc lập xài luôn, không dính dáng gì tới clsGDIPlug và modAPITypes ? Cứ môi trường VBA của Office xài được !
 
Upvote 0
- Đưa vô file Access rồi đây bác.
- Code đưa còn thiếu mấy cái hàm: ArrayFromPicture, ResampleGDIP, LoadPictureGDIP
- Báo lỗi "Type mismatch" chỗ biến "bin2"
đang làm cái File lưu CMND vào Data Access xem lại bài này ... thì thấy kiểu như đính kèm file Ảnh vào Access ý

Còn 1 cách khác nữa là lưu vào Access cũng xem ok xem hình dưới tên 22,33,777 là tên ảnh đó
vậy cách nào hay bạn nhỉ ???

1600347703799.png
 
Upvote 0
đang làm cái File lưu CMND vào Data Access xem lại bài này ... thì thấy kiểu như đính kèm file Ảnh vào Access ý

Còn 1 cách khác nữa là lưu vào Access cũng xem ok xem hình dưới tên 22,33,777 là tên ảnh đó
vậy cách nào hay bạn nhỉ ???

Hình 1 là dùng kiểu dữ liệu "Attachment" có sẳn từ Access 2007 trở lên, đem qua các máy xài Office phiên bản thấp hơn là không chạy được.
Hình 2 là dùng kiểu dữ liệu OLE Object, kiểu dữ liệu này thì Access 2003 cũng có nên tính tương thích cao hơn.
Muốn thao tác nhanh thì dùng Attachment, tải file ảnh lên để lưu nhanh. Còn cách 2 thì dùng phương thức GETCHUNK/ APPENDCHUNK của thư viện DAO hoặc ADO để convert file ảnh thành dạng BInary rồi lưu xuống Field OLE Object.
2 cách trên đều lưu file ảnh vào hệ thống Table của Access sẽ làm file tăng dung lượng nhanh. Tại sao bạn không dùng đường dẫn file ảnh để nhẹ nhàng hơn. Tôi thường dùng cách 2 (lưu xuống Table) cho các file ảnh Logo, Icon nút lệnh dung lượng vài chục kB để khi truy xuất sẽ nhanh hơn thôi.
 
Upvote 0

Bài viết mới nhất

Back
Top Bottom