Tôi đã có chính xác này vấn đề tương tự trước đây.
Vui lòng sao chép những gì tôi đã làm và hy vọng nó sẽ giúp bạn / giải quyết vấn đề của bạn.
Tôi đã giải quyết nó như thế nào
Ý tưởng đầu tiên của tôi đã thất bại, tương tự như những gì bạn có thể đang nghĩ, là tôi đã kết thúc việc tạo chuỗi cho mọi hình ảnh đơn lẻ (bất kể kích thước nào). Nhưng tôi nhanh chóng phát hiện ra rằng điều này làm đầy cơ sở dữ liệu của bạn siêu nhanh và không hiệu quả.
Tùy chọn tiếp theo (hoạt động) là một hình ảnh nhỏ hơn (như 5px
của bạn ý tưởng) và tôi đã làm chính xác điều đó, nhưng với 10px
* 10px
hình ảnh. Cách tôi tạo 'băm' cho mỗi hình ảnh là imagecolorat()
chức năng.
Khi nhận được rgb
màu sắc cho hình ảnh, tôi đã làm tròn chúng đến 50
gần nhất , do đó màu sắc ít cụ thể hơn. Số đó (50
) là những gì bạn muốn thay đổi tùy thuộc vào cách cụ thể bạn muốn các tìm kiếm của mình trở thành.
ví dụ:
// Pixel RGB
rgb(105, 126, 225) // Original
rgb(100, 150, 250) // After rounding numbers to nearest 50
Sau khi thực hiện việc này với từng pixel (10px
* 10px
sẽ cung cấp cho bạn 100 rgb()
trở lại), sau đó tôi chuyển chúng thành một mảng và lưu trữ chúng trong cơ sở dữ liệu dưới dạng base64_encode()
và serialize()
.
Khi thực hiện tìm kiếm các hình ảnh tương tự, tôi đã thực hiện cùng một quy trình chính xác với hình ảnh mà họ muốn tải lên, sau đó trích xuất các 'băm' hình ảnh từ cơ sở dữ liệu để so sánh tất cả chúng và xem những gì đã phù hợp với rgb
của.
Mẹo
-
Lớn hơn
50
đó nằm trongrgb
làm tròn, ít cụ thể hơn tìm kiếm của bạn sẽ là (và ngược lại). -
Nếu bạn muốn SQL của mình để cụ thể hơn, tốt hơn bạn nên lưu trữ bổ sung / cụ thể thông tin về hình ảnh trong cơ sở dữ liệu, để bạn có thể giới hạn các tìm kiếm bạn nhận được trong cơ sở dữ liệu. ví dụ: . nếu tỷ lệ co là
4:3
, chỉ kéo hình ảnh xung quanh4:3
từ cơ sở dữ liệu. (v.v.) -
Có thể khó để có được điều này một cách hoàn hảo
5px
*5px
, vì vậy, một đề xuất là phpthumb . Tôi đã sử dụng nó với cú pháp:
Chúc bạn may mắn, hy vọng tôi có thể giúp đỡ.