เมื่อเร็ว ๆ นี้รหัสการตรวจสอบการเลื่อนได้กลายเป็นที่นิยมในหลาย ๆ เว็บไซต์ ในอีกด้านหนึ่งมันค่อนข้างแปลกสำหรับประสบการณ์ผู้ใช้และใช้งานง่าย ในทางกลับกันความปลอดภัยยังไม่ลดลงอย่างมากเมื่อเทียบกับรหัสการตรวจสอบกราฟิก แน่นอนว่ายังไม่มีการตรวจสอบความปลอดภัยที่แน่นอน แต่มันเป็นเพียงการเพิ่มค่าใช้จ่ายในการบายพาสสำหรับผู้โจมตี
ถัดไปวิเคราะห์กระบวนการหลักของการเลื่อนรหัสการตรวจสอบ:
แบบสุ่มสร้างภาพตัดและภาพพื้นหลังด้วยเงาคัตเอาท์บนแบ็กเอนด์และบันทึกพิกัดตำแหน่งคัตเอาท์แบบสุ่มในพื้นหลัง
ส่วนหน้าตระหนักถึงการโต้ตอบแบบเลื่อนทำให้การตัดบนเงาตัดและได้รับค่าระยะทางเลื่อนของผู้ใช้เช่นตัวอย่างต่อไปนี้
ส่วนหน้าผ่านค่าระยะทางเลื่อนของผู้ใช้ไปยังส่วนหลังและส่วนหลังจะตรวจสอบว่าข้อผิดพลาดอยู่ในช่วงที่อนุญาตหรือไม่
ที่นี่เพียงการตรวจสอบระยะการเลื่อนของผู้ใช้เป็นการตรวจสอบขั้นพื้นฐานที่สุด ด้วยเหตุผลด้านความปลอดภัยที่สูงขึ้นเส้นทางการเคลื่อนที่ทั้งหมดของการเลื่อนของผู้ใช้พฤติกรรมการเข้าถึงของผู้ใช้ในหน้าปัจจุบัน ฯลฯ อาจได้รับการพิจารณา สิ่งเหล่านี้อาจซับซ้อนและถึงแม้จะมีความช่วยเหลือของแบบจำลองการวิเคราะห์ข้อมูลพฤติกรรมผู้ใช้เป้าหมายสูงสุดคือการเพิ่มความยากลำบากในการจำลองที่ผิดกฎหมายและการข้าม นี่คือโอกาสที่สามารถสรุปและสรุปวิธีการที่ใช้กันทั่วไป บทความนี้มุ่งเน้นไปที่วิธีการสร้างรหัสการตรวจสอบแบบเลื่อนทีละขั้นตอนตาม Java
จะเห็นได้ว่ารหัสการตรวจสอบกราฟิกแบบเลื่อนประกอบด้วยสองภาพสำคัญการตัดบล็อกและภาพต้นฉบับพร้อมเงาตัดบล็อก มีคุณสมบัติที่สำคัญสองประการที่นี่เพื่อให้แน่ใจว่ามีความยากลำบากในการถูกบังคับใช้เดรัจฉาน: รูปร่างของการตัดบล็อกและตำแหน่งของภาพต้นฉบับที่บล็อกตั้งอยู่นั้นเป็นแบบสุ่ม สิ่งนี้จะช่วยให้การจับคู่แบบสุ่มที่ไม่สม่ำเสมอและภาพต้นฉบับที่จะสร้างในชุดรูปภาพที่ จำกัด
วิธีใช้รหัสเพื่อแยกภาพขนาดเล็กที่มีรูปร่างสุ่มเฉพาะจากภาพขนาดใหญ่?
ขั้นตอนแรกคือการกำหนดโครงร่างของภาพคัตเอาท์เพื่ออำนวยความสะดวกในการดำเนินการจริงของการดำเนินการประมวลผลภาพในอนาคต
ภาพประกอบด้วยพิกเซลและแต่ละจุดพิกเซลสอดคล้องกับสี สีสามารถแสดงในรูปแบบ RGB รวมถึงความโปร่งใสและเข้าใจภาพเป็นรูประนาบโดยมีมุมซ้ายบนเป็นจุดกำเนิดไปทางแกน x ขวาและไปยังแกน y ลงค่าพิกัดสอดคล้องกับสีของจุดพิกเซลที่ตำแหน่งที่สอดคล้องกัน จากการพิจารณานี้โครงร่างจะแสดงด้วยอาร์เรย์สองมิติโดยมีค่าองค์ประกอบภายในโครงร่างเป็น 1 และค่าองค์ประกอบนอกโครงร่างเป็น 0
ในเวลานี้คุณต้องคิดเกี่ยวกับวิธีการสร้างรูปร่างร่างนี้ มีระบบพิกัดสี่เหลี่ยมและวงกลม ใช่ใช้ฟังก์ชั่นกราฟิกทางคณิตศาสตร์ โดยทั่วไปฟังก์ชั่นการใช้สมการฟังก์ชั่นของวงกลมและฟังก์ชั่นแนวเส้นสี่เหลี่ยมจัตุรัสคล้ายกับ:
ใน (xa) ²+(yb) ² = r²มีสามพารามิเตอร์ a, b และ r นั่นคือพิกัดกลางคือ (a, b) และรัศมี r คัตเอาท์เหล่านี้จะถูกวางไว้ในระบบพิกัดที่อธิบายไว้ข้างต้นและง่ายต่อการคำนวณค่าเฉพาะจากกราฟ
รหัสตัวอย่างมีดังนี้:
ส่วนตัว int [] [] getBlockData () {int [] [] data = new int [targetLength] [TargetWidth]; double x2 = targetLength-circler-2; // ตำแหน่งของวงกลมที่สร้างขึ้นแบบสุ่ม Double H1 = Circler + Math.random () * (TargetWidth-3 * Circler-R1); double po = circler*circler; double xbegin = targetLength-Circler-R1; double ybegin = targetWidth-circler-R1; สำหรับ (int i = 0; i <targetLength; i ++) {สำหรับ (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; }}} ส่งคืนข้อมูล; -ขั้นตอนที่สองคือหลังจากโครงร่างนี้คุณสามารถกำหนดคัตเอาท์ตามค่าของอาร์เรย์สองมิตินี้และเพิ่มเงาลงในตำแหน่งคัตเอาท์บนภาพต้นฉบับ
การดำเนินการมีดังนี้:
cutbytemplate ส่วนตัว (bufferedimage oriimage, bufferedimage targetImage, int [] [] templateimage, int x, int y) {สำหรับ (int i = 0; i <targetLength; i ++) {สำหรับ (int j = 0; j <targetWidth; 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); -หลังจากสองขั้นตอนแรกคุณจะได้รับการตัดและภาพต้นฉบับด้วย cutout shadow เพื่อเพิ่มความสับสนและปรับปรุงเอฟเฟกต์การโหลดเครือข่ายจำเป็นต้องมีการประมวลผลภาพเพิ่มเติม โดยทั่วไปมีสองสิ่งที่ต้องทำ หนึ่งคือการเบลอภาพและเพิ่มความยากลำบากในการจดจำเครื่องจักรและอื่น ๆ คือการบีบอัดที่เหมาะสมของคุณภาพเดียวกัน การประมวลผลแบบฟัซซี่เป็นเรื่องง่ายที่จะนึกถึงความคลุมเครือแบบเกาส์เซียนและหลักการนั้นง่ายต่อการเข้าใจ คุณสามารถไปที่ Google เพื่อเรียนรู้เกี่ยวกับมัน โดยเฉพาะสำหรับการใช้งาน Java มีหลายรุ่น ตอนนี้ไม่มีขวดบุคคลที่สามให้ตัวอย่าง:
สาธารณะคงที่ convolveop getgaussianblurfilter (int radius, boolean แนวนอน) {ถ้า (รัศมี <1) {โยน unlegalargumentException ใหม่ ("รัศมีต้องเป็น> = 1"); } int size = radius * 2 + 1; float [] data = ใหม่ลอย [ขนาด]; Float Sigma = Radius / 3.0f; float twosigmasquare = 2.0f * sigma * sigma; float sigmaroot = (float) math.sqrt (twosigmasquare * math.pi); ลอยทั้งหมด = 0.0f; สำหรับ (int i = -radius; i <= radius; i ++) {ระยะทางลอย = i * i; INT INDEX = I + RADIUS; ข้อมูล [ดัชนี] = (float) math.exp (-distance / twosigmasquare) / sigmaroot; ทั้งหมด += ข้อมูล [ดัชนี]; } สำหรับ (int i = 0; i <data.length; i ++) {data [i] /= ทั้งหมด; } เคอร์เนลเคอร์เนล = null; ถ้า (แนวนอน) {เคอร์เนล = เคอร์เนลใหม่ (ขนาด, 1, ข้อมูล); } else {kernel = kernel ใหม่ (1, ขนาด, ข้อมูล); } ส่งคืน convolveop ใหม่ (เคอร์เนล, convolveop.edge_no_op, null); } โมฆะคงที่สาธารณะ SimpleBlur (BufferedImage SRC, BufferedImage Dest) {bufferedImageop op = getGaussianBlurfilter (2, false); op.filter (src, dest); -เอฟเฟกต์เบลอนั้นดีมากหลังจากการทดสอบ นอกจากนี้ยังเป็นการบีบอัดภาพและไม่มีเครื่องมือของบุคคลที่สามที่ใช้ในการบีบอัดที่เป็นเนื้อเดียวกัน
สาธารณะคงที่สาธารณะ [] frombufferedimage2 (bufferedimage img, string imagetype) โยน ioexception {bos.reset (); // รับ Iterator Writer <AmageWriter> iter = imageio.getimagewritersbyformatname (imageType); ImagewRiter Writer = (ImageWriter) iter.next (); // รับการตั้งค่าพารามิเตอร์เอาต์พุตของนักเขียนที่ระบุ (Imagewriteparam) Imagewriteparam IWP = Writer.getDefaultWriteParam (); iwp.setCompressionMode (imagewriteparam.mode_explict); // ตั้งค่าว่าจะบีบอัด IWP.SetCompressionQuality (1F); // ตั้งค่าพารามิเตอร์คุณภาพการบีบอัด IWP.SetProgressiveMode (Imagewriteparam.mode_disabled); colormodel colormodel = colormodel.getrgbdefault (); // ระบุโหมดสีที่ใช้ในระหว่างการบีบอัด IWP.SetDestinationType (Javax.imageio.imagetypespecifier ใหม่ (Colormodel, Colormodel.CreateCompatiblesAmpleModel (16, 16))); Writer.SetOutput (Imageio .CreateImageOutputStream (BOS)); iioimage iiamge = ใหม่ iioImage (img, null, null); Writer.write (null, iiamge, iwp); ไบต์ [] d = bos.tobytearray (); กลับ D; -ณ จุดนี้กระบวนการประมวลผลรหัสของแกนหลักของรหัสการตรวจสอบเลื่อนเสร็จสมบูรณ์แล้ว มีรายละเอียดมากมายที่สามารถขัดและปรับให้เหมาะสมอย่างต่อเนื่องเพื่อให้ประสบการณ์การเลื่อนสามารถดีขึ้นได้ ฉันหวังว่ามันจะช่วยนักเรียนบางคนที่กำลังเตรียมสร้างรหัสตรวจสอบเลื่อนของตนเอง
การใช้งานรหัสข้างต้นได้รับการขัดเกลามาก ในอีกด้านหนึ่งเพื่อให้แน่ใจว่าประสิทธิภาพและในทางกลับกันมันเป็นเรื่องง่ายที่จะเข้าใจ นอกจากนี้เนื่องจากเหตุผลต่าง ๆ จึงไม่สะดวกที่จะแนะนำรายละเอียดมากเกินไป หากคุณมีคำถามใด ๆ คุณสามารถฝากข้อความไว้เพื่อสื่อสาร หลังจากการทดสอบเวลาตอบสนองกระบวนการของการสร้างกราฟิกแบบเลื่อนสามารถควบคุมได้ที่ประมาณ 20ms หากความละเอียดภาพดั้งเดิมต่ำกว่า 300px*150px มันสามารถเข้าถึงได้ประมาณ 10ms ซึ่งอยู่ในช่วงที่ยอมรับได้ หากมีวิธีที่มีประสิทธิภาพมากขึ้นฉันหวังว่าจะให้คำแนะนำกับฉัน ฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น