Недавно скользящие коды проверки постепенно становятся популярными на многих веб -сайтах. С одной стороны, это относительно новое для пользовательского опыта и простой в эксплуатации. С другой стороны, безопасность не была значительно снижена по сравнению с кодами графической проверки. Конечно, до сих пор нет абсолютной проверки безопасности, но она просто увеличивает стоимость обхода для злоумышленников.
Далее проанализируйте основной процесс скольжения кода проверки:
Случайно генерирует вырезы и фоновые изображения с тени выреза на бэкэнд и сохраняет координаты положения случайных выреза на заднем плане.
Фронт-энд реализует скользящее взаимодействие, помещает вырез в тень выреза и получает значение расстояния скольжения пользователя, например, следующий пример
Передняя часть передает значение расстояния скольжения пользователя в заднюю часть, а на задней части проверяется, находится ли ошибка в допустимом диапазоне.
Здесь, просто проверка расстояния скольжения пользователя является самой основной проверкой. По более высоким соображениям безопасности вся траектория скольжения пользователя, поведение доступа пользователя на текущей странице и т. Д. Также может быть рассмотрено. Они могут быть сложными, и даже с помощью моделей анализа данных поведения пользователя конечная цель состоит в том, чтобы увеличить сложность незаконного моделирования и обхода. Это возможности, которые могут быть обобщены и обобщены обще используемыми методами. Эта статья посвящена тому, как генерировать скользящие коды проверки шаг за шагом на основе Java.
Можно видеть, что скользящий код проверки графики состоит из двух важных изображений, резки блока и оригинальной картинки с тенью резки блока. Здесь есть две важные функции, чтобы обеспечить сложность быть грубой: форма резки блока и положение исходного изображения, в котором находится блок, является случайной. Это позволяет создавать случайные, нерегулярно найденные пары вырезов и оригинальных изображений в ограниченном наборе изображений.
Как использовать код для извлечения небольшого изображения с определенной случайной формой из большой картинки?
Первым шагом является определение схемы изображения выреза, чтобы облегчить фактическое выполнение операции обработки изображений в будущем.
Изображение состоит из пикселей, и каждая точка пикселя соответствует цвету. Цвет может быть представлен в форме RGB, плюс прозрачность, и понимать изображение как плоскостную фигуру, с верхним левым углом в качестве начала, к правой оси x, и к оси вниз, значение координаты соответствует цвету точки пикселя в соответствующем положении, так что изображение может быть преобразована в двухмерную сетку. Основываясь на этом соображении, контур также представлен двумерным массивом, причем значение элемента внутри контура составляет 1, а значение элемента вне контура-0.
В настоящее время вы должны подумать о том, как генерировать эту форму схемы. Существуют системы координат, прямоугольники и круги. Да, используются математические графические функции. Как правило, функции, использующие уравнение функции круга и функцию боковой линии прямоугольника, аналогичны:
В (xa) ²+(yb) ² = r² существует три параметра A, B и R, то есть центральная координата составляет (a, b) и радиус r. Эти вырезы размещаются в системе координат, описанной выше, и легко рассчитать конкретные значения с графика.
Пример кода заключается в следующем:
private int [] [] getBlockData () {int [] [] data = new int [targetLength] [targetWidth]; Double x2 = TargetLength-Circler-2; // положение случайно сгенерированного круга двойного h1 = circler + math.random () * (targetwidth-3 * circler-r1); Double Po = Circler*Circler; Double xbegin = TargetLength-Circler-R1; double ybegin = targetwidth-circler-r1; for (int i = 0; i <targetLength; i ++) {for (int j = 0; j <targetwidth; j ++) {// справа ○ double d3 = math.pow (i - x2,2)+math.pow (j - h1,2); if (d1 <= po || (j> = ybegin && d2> = po) || (i> = xbegin && d3> = po)) {data [i] [j] = 0; } else {data [i] [j] = 1; }}} вернуть данные; }Второй шаг состоит в том, что после этого контура вы можете определить вырез на основе значения этого двумерного массива и добавить тень в позицию выреза на исходном изображении.
Операция заключается в следующем:
Private void CutbyTemplate (BufferedImage oriimage, BufferedImage TargetImage, int [] [] TemplateImage, int x, int y) {for (int i = 0; i <targetLength; i ++) {для (int j = 0; j <targetWidth; j ++) {int rgb = templateimage [i] [j]; // процесс обесцвечивания цвета в соответствующей позиции в исходном изображении int rgb_ori = oriimage.getrgb (x + i, y + j); if (rgb == 1) {// Скопировать соответствующее значение цвета на вырезании изображения targetimage.setrgb (i, y + j, rgb_ori); int r = (0xff & rgb_ori); int g = (0xff & (rgb_ori >> 8)); int b = (0xff & (rgb_ori >> 16))); rgb_ori = r + (g << 8) + (b << 16) + (200 << 24); // изменение цвета соответствующей позиции исходного изображения oriimage.setrgb (x + i, y + j, rgb_ori); }}}}После первых двух шагов вы получите вырез и оригинальную картинку с Shadow. Чтобы увеличить путаницу и улучшить эффект загрузки сети, также необходима дальнейшая обработка изображений. Как правило, есть две вещи. Одним из них является размытие изображения и увеличить сложность распознавания машины, а другой - выполнить соответствующее сжатие того же качества. Нечеткая обработка легко подумать о гауссовой нечеткости, и этот принцип легко понять. Вы можете пойти в Google, чтобы узнать об этом. В частности, для реализации Java, есть много версий. Теперь нет сторонних банок, чтобы привести пример:
public static convolveop getgaussianblurfilter (int radius, boolean horizontal) {if (radius <1) {бросить новое allosalargumentException ("radius должен быть> = 1"); } int size = radius * 2 + 1; float [] data = new Float [size]; float sigma = radius / 3.0f; float twosigmasquare = 2,0f * sigma * sigma; float sigmaroot = (float) math.sqrt (twosigmasquare * math.pi); Float Total = 0,0F; for (int i = -radius; i <= radius; i ++) {float distance = i * i; int index = i + radius; data [index] = (float) math.exp (-distance / twosigmasquare) / sigmaroot; Total += Data [Index]; } for (int i = 0; i <data.length; i ++) {data [i] /= total; } Kernel kernel = null; if (horizontal) {kernel = новое ядро (размер, 1, данные); } else {kernel = new kernel (1, size, data); } вернуть новый Convolveop (kernel, convolveop.edge_no_op, null); } public static void simpleblur (bufferedimage src, bufferedimage dest) {bufferedimageop op = getgaussianblurfilter (2, false); op.filter (src, dest); }Размывающий эффект был очень хорошим после тестирования. Кроме того, это сжатие изображения, и никакие сторонние инструменты не используются для выполнения гомогенного сжатия.
Public Static Byte [] FromBufferedImage2 (BufferedImage IMG, String ImageType) бросает ioException {bos.reset (); // Получить итератор автора <ImageWriter> iter = imageio.getimageWritersByformatName (ImageType); Imagewriter writer = (imagewriter) iter.next (); // Получить настройки выходного параметра указанного писателя (ImageWriteParam) ImageWriteParam iwp = writer.getDefaultWriteParam (); iwp.setCompressionMode (imageWriteParam.mode_explicit); // установить, сжатие IWP.SetCompressionQuality (1F); // Установить параметры качества сжатия iwp.setProgressiVemode (imageWriteParam.mode_disabled); Colormodel colormodel = colormodel.getrgbdefault (); // указать режим цвета, используемый во время сжатия iwp.setDestinationType (new javax.imageio.imagetypespecifier (colormodel, colormodel.createcompatiblesamplemodel (16, 16))); writer.setOutput (imageIo. CreateImageOutputStream (BOS)); Iioimage iiamge = new iioimage (img, null, null); writer.write (null, iiamge, iwp); byte [] d = bos.tobytearray (); возврат D; }На этом этапе был завершен процесс обработки кода сердечника кода скольжения. Есть много деталей, которые могут быть непрерывно отполированы и оптимизированы, так что опыт скольжения может быть лучше. Я надеюсь, что это может помочь некоторым студентам, которые готовятся создать свой собственный код проверки скольжения.
Вышеуказанные реализации кода очень утонченные. С одной стороны, чтобы обеспечить производительность, а с другой стороны, это легко понять. Кроме того, по разным причинам не удобно представлять слишком много деталей. Если у вас есть какие -либо вопросы, вы можете оставить сообщение для общения. После тестирования время отклика процесса генерации скользящей графики можно контролировать примерно на 20 мс. Если исходное разрешение изображения ниже 300px*150px, оно может достигать 10 мс, что находится в приемлемом диапазоне. Если есть более эффективный способ, я надеюсь дать мне несколько советов. Я также надеюсь, что все будут поддерживать Wulin.com больше.