최근에 슬라이딩 검증 코드는 많은 웹 사이트에서 점차 인기를 얻었습니다. 한편으로, 그것은 사용자 경험이 비교적 참신하고 운영하기 간단합니다. 반면, 그래픽 검증 코드와 비교하여 보안이 크게 줄어들지 않았습니다. 물론 지금까지 절대적인 보안 검증은 없지만 공격자의 우회 비용을 증가시키고 있습니다.
다음으로 슬라이딩 검증 코드의 핵심 프로세스를 분석하십시오.
백엔드에 컷 아웃 그림자가있는 컷 아웃 및 배경 이미지를 무작위로 생성하고 백그라운드에서 임의의 컷 아웃 위치 좌표를 저장합니다.
프론트 엔드는 슬라이딩 상호 작용을 깨닫고 컷 아웃을 컷 아웃 그림자에 넣고 다음 예제와 같은 사용자의 슬라이딩 거리 값을 얻습니다.
프론트 엔드는 사용자 슬라이딩 거리 값을 백엔드로 전달하고 백엔드는 오류가 허용 범위 내에 있는지 확인합니다.
여기에서 사용자의 슬라이딩 거리를 확인하는 것이 가장 기본적인 검증입니다. 더 높은 보안상의 이유로, 사용자의 슬라이딩의 전체 궤적, 현재 페이지의 사용자의 액세스 동작 등도 고려 될 수 있습니다. 이는 복잡 할 수 있으며 사용자 행동 데이터 분석 모델의 도움을 받아도 궁극적 인 목표는 불법 시뮬레이션의 어려움을 높이고 우회하는 것입니다. 이것은 일반적으로 사용되는 방법을 요약하고 요약 할 수있는 기회입니다. 이 기사는 Java를 기반으로 슬라이딩 검증 코드를 단계별로 생성하는 방법에 중점을 둡니다.
슬라이딩 그래픽 검증 코드는 두 가지 중요한 그림, 블록 절단 및 블록 절단 그림자가있는 원래 그림으로 구성되어 있음을 알 수 있습니다. 여기에는 무차별 대구가 어려워지기위한 두 가지 중요한 기능이 있습니다. 블록 절단의 모양과 블록이 위치한 원래 그림의 위치는 무작위입니다. 이를 통해 무작위로 불규칙하게 발견 된 컷 아웃 및 원본 이미지가 제한된 이미지 세트에서 생성 될 수 있습니다.
코드를 사용하여 큰 그림에서 특정 임의의 모양으로 작은 그림을 추출하는 방법은 무엇입니까?
첫 번째 단계는 컷 아웃 이미지의 개요를 결정하여 향후 이미지 처리 작업의 실제 실행을 용이하게하는 것입니다.
그림은 픽셀로 구성되며 각 픽셀 포인트는 색상에 해당합니다. 색상은 RGB 형태와 투명성으로 표시 될 수 있으며, 왼쪽 상단 코너를 원점으로, 오른쪽 x 축 및 다운 y 축에 평면 그림으로 이해할 수 있습니다. 좌표 값은 해당 위치에서 픽셀 포인트의 색상에 해당하므로 그림이 2 차원 어레이로 변환 될 수 있습니다. 이 고려 사항에 따라, 개요는 또한 2 차원 배열로 표시되며, 개요 내부의 요소 값은 1이고, 외곽의 요소 값은 0입니다.
현재이 개요 모양을 생성하는 방법에 대해 생각해야합니다. 좌표계, 사각형 및 원이 있습니다. 예, 수학적 그래픽 기능이 사용됩니다. 일반적으로 원의 기능 방정식과 사각형의 사이드 라인 함수를 사용한 기능은 다음과 유사합니다.
(xa) ²+(yb) ² = r²에서, 세 가지 매개 변수 a, b 및 r이 있습니다. 즉, 중심 좌표는 (a, b)이고 반경 r입니다. 이 컷 아웃은 위에서 설명한 좌표계에 배치되며 그래프에서 특정 값을 쉽게 계산할 수 있습니다.
샘플 코드는 다음과 같습니다.
private int [] [] getBlockData () {int [] [] data = new int [targetLength] [targetWidth]; 이중 X2 = TargetLength-Circler-2; // 무작위로 생성 된 원의 위치 Double H1 = Circler + Math.random () * (TargetWidth-3 * Circler-R1); 이중 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; }}} 데이터를 반환합니다. }두 번째 단계는이 개요 후이 2 차원 배열의 값에 따라 컷 아웃을 결정하고 원본 이미지의 컷 아웃 위치에 그림자를 추가 할 수 있다는 것입니다.
작업은 다음과 같습니다.
개인 void cutbytemplate (bufferedImage oriimage, bufferedImage targetImage, int [] [] templateImage, int x, int y) {for (int i = 0; i <targetlength; i ++) {for (int j = 0; // 원래 이미지의 해당 위치에서 색상 변색 프로세스 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); }}}}처음 두 단계 후에는 컷 아웃과 컷 아웃 그림자가있는 원본 사진을 얻게됩니다. 혼란을 높이고 네트워크 로딩 효과를 향상시키기 위해서는 이미지의 추가 처리도 필요합니다. 일반적으로해야 할 두 가지가 있습니다. 하나는 이미지를 흐리게하고 기계 인식의 어려움을 높이고 다른 하나는 동일한 품질의 적절한 압축을 수행하는 것입니다. 퍼지 처리는 가우시안 퍼지를 쉽게 생각하기 쉽고 원칙은 이해하기 쉽습니다. Google에 가서 배울 수 있습니다. 특히 Java 구현의 경우 많은 버전이 있습니다. 이제 예를 제공 할 제 3 자 항아리가 없습니다.
public static convolbeop getgaussianblurfilter (int radius, boolean 수평) {if (radius <1) {새로운 불법 불법 행정 exception ( "반경은> = 1"); } int size = radius * 2 + 1; float [] data = new float [size]; 플로트 시그마 = 반경 / 3.0f; float twosigmasquare = 2.0f * 시그마 * 시그마; float sigmaroot = (float) math.sqrt (twosigmasquare * math.pi); float total = 0.0f; for (int i = -radius; i <= radius; i ++) {float 거리 = i * i; int index = i + 반경; 데이터 [index] = (float) math.exp (-distance / twosigmasquare) / sigmaroot; Total += Data [index]; } for (int i = 0; i <data.length; i ++) {data [i] /= total; } 커널 커널 = null; if (수평) {kernel = new Kernel (size, 1, data); } else {커널 = 새 커널 (1, 크기, 데이터); } 새 컨볼 브 폴프 (kernel, convolbeop.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 (); // Writer iterator <ImageWriter> iter = imageio.getImageWritersByFormatName (imageType)을 가져옵니다. ImageWriter Writer = (ImageWriter) iter.next (); // 지정된 Writer (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 = 새로운 iioimage (img, null, null); Writer.Write (NULL, IAMGE, IWP); 바이트 [] d = bos.tobytearray (); 반환 d; }이 시점에서 슬라이딩 검증 코드의 핵심 코드 처리 프로세스가 완료되었습니다. 슬라이딩 경험이 더 나을 수 있도록 지속적으로 연마되고 최적화 될 수있는 많은 세부 사항이 있습니다. 나는 그것이 자신의 슬라이딩 검증 코드를 구축 할 준비를하는 일부 학생들이 도움이되기를 바랍니다.
위의 코드 구현은 매우 세련되었습니다. 한편으로, 성능을 보장하기 위해, 반면에, 이해하기 쉽습니다. 또한 여러 가지 이유로 인해 너무 많은 세부 사항을 소개하는 것이 편리하지 않습니다. 궁금한 점이 있으면 의사 소통을 위해 메시지를 남길 수 있습니다. 테스트 후, 슬라이딩 그래픽 생성의 공정 응답 시간은 약 20ms에서 제어 될 수 있습니다. 원래 이미지 해상도가 300px*150px 미만이면 허용 범위 내에있는 약 10ms에 도달 할 수 있습니다. 더 효율적인 방법이 있다면 조언을 드리고 싶습니다. 또한 모두가 wulin.com을 더 지원하기를 바랍니다.