Member 13349523 Ответов: 2

Как сравнить два изображения в операторе SQL select


я использовал две коробки с картинками. для получения изображения с компьютера и картинку, чтобы сравнить изображения в базе и вспомнить, что изображения, если оно совпадает с имя picturebox1 но он не работает.он показывает "типы данных изображения и varchar несовместимы в равной оператора. может ли кто-нибудь сказать код для сравнения этого.

Что я уже пробовал:

выберите изображение из таблицы 1, где image='"+picturebox1. image"' ;

Richard MacCutchan

Вы не можете сравнивать различные типы объектов, так как система не может определить, какие части отличаются. Вы должны преобразовать и то, и другое в изображения или байтовые массивы и сравнить их байт за байтом.

F-ES Sitecore

Если вам нужно иметь возможность выбрать "изображение", то вы можете посмотреть, как вы можете превратить изображение в хэш, а затем Сохранить изображение и хэш в своей таблице. Чтобы выбрать изображение, преобразуйте его в хэш и "select * where ImageHash = @hash"

2 Ответов

Рейтинг:
2

RickZeeland

Вам нужно преобразовать в Массив байтов прежде чем вы сможете сравнить, посмотрите эту статью: Хранение или сохранение изображений в SQL Server[^]
А также здесь: Вставка и извлечение изображений из базы данных SQL Server без использования хранимых процедур[^]
Обратите внимание, что Image тип поля устарел, вместо него используйте varbinary(MAX)


Рейтинг:
2

OriginalGriff

Во-первых, когда вы делаете это в C#:

... select image from table1 where image='"+picturebox1.image"' ;
Он не добавляет изображение к выбранному. То, что вы получаете, - это строка:
... select image from table1 where image='System.Drawing.Bitmap'

Смотрите здесь почему: Почему я получаю " параметр недопустим." исключение, когда я читаю изображение из своей базы данных?[^]
Если вы использовали подобный код для вставки своих изображений в БД, то у меня есть для вас плохая новость: все они бесполезны. Ссылка показывает, как вам нужно сделать это правильно.

Это также подразумевает, что вы обычно строите SQL-команды следующим образом: не делайте этого. Никогда не объединяйте строки для построения SQL-команды. Это оставляет вас широко открытыми для случайной или преднамеренной атаки SQL-инъекции, которая может уничтожить всю вашу базу данных. Вместо этого используйте параметризованные запросы.

Я бы также предположил, что это плохая идея - сравнивать изображения непосредственно в SQL-это будет ужасно с точки зрения производительности.
Вместо этого генерируйте хэши и сравнивайте их - только одни и те же изображения хэш-значений должны быть непосредственно сопоставлены для равенства, экономя много времени и памяти, потребляющих сравнения.


Member 13349523

можете ли вы дать мне точный код для сравнения двух изображений? одно изображение из picture box, а другое из базы данных, потому что я хочу взять изображение в качестве входных данных и сравнить его с сохраненным изображением im db и распечатать какое-то утверждение.. я едва ударил в этом .. я не могу продолжать .. плз, ты можешь мне помочь, братан

OriginalGriff

Не делай этого так.
Проблема в том, что изображения довольно большие, и сравнение многих из них означает, что вы либо занимаете много времени SQL Server - если вы делаете это на SQL - либо большую пропускную способность - если вы делаете это на C# - потому что вам нужно вытащить каждое изображение из базы данных на свой компьютер, чтобы сравнить их. Это действительно неэффективно, и если у вас есть несколько пользователей, делающих это (а несколько пользователей - это весь смысл SQL Server в конце концов), то быстро наступает момент, когда все это прекращается для всех - вы эффективно разрабатываете свою личную DDOS-атаку на свои собственные системы!

Вместо этого сохраните дополнительное поле с вашим изображением (или два могут быть даже лучше), которые хранят один или два хэша: и, например, MD5 и SHA512. Вы вычисляете хеш-значение изображения, когда вы ВСТАВЛЯЕТЕ его в БД, и одновременно сохраняете хеш-значения. Затем, когда вы захотите его найти, вычислите хеш (а) для «нового» изображения и используйте SQL, чтобы найти только те, которые имеют идентичный хеш. Это быстро, потому что хэши (по определению) намного меньше, чем само изображение, но почти достаточно уникальны, чтобы большую часть времени вы возвращали только одно совпадение. Быстрое сравнение нескольких (или одного) изображения с подходящим хешем, и вы точно знаете, что это одно и то же изображение.

Member 13349523

спасибо за твои предложения, брат... я стараюсь работать над этим..

Member 13349523

можете ли вы сказать мне, как вычислить хэш для изображения?.

OriginalGriff

Гугл не работает сегодня?
https://www.google.co.uk/search?q=how+to+calculate+hash+for+an+image+c%23&oq=how+to+calculate+hash+for+an+image+c%23&aqs=chrome..69i57.5988j0j7&sourceid=chrome&ie=UTF-8