最近、スライド検証コードは多くのウェブサイトで徐々に人気があります。一方では、ユーザーエクスペリエンスにとっては比較的斬新で、操作が簡単です。一方、グラフィック検証コードと比較して、セキュリティは大幅に削減されていません。もちろん、これまでのところ、絶対的なセキュリティの検証はありませんが、攻撃者のバイパスのコストを増やしているだけです。
次に、スライド検証コードのコアプロセスを分析します。
バックエンドに切り取られた影があるカットアウトと背景画像をランダムに生成し、バックグラウンドでランダムな切り抜き位置座標を保存します。
フロントエンドは、スライドの相互作用を実現し、切り抜きの影にカットアウトを置き、次の例などのユーザーのスライド距離値を取得します
フロントエンドは、ユーザーのスライド距離値をバックエンドに渡し、バックエンドはエラーが許容範囲内であるかどうかを確認します。
ここでは、ユーザーのスライド距離を単純に確認することが最も基本的な検証です。より高いセキュリティ上の理由により、ユーザーのスライドの軌跡全体、現在のページでのユーザーのアクセス動作なども考慮される場合があります。これらは複雑であり、ユーザーの行動データ分析モデルの助けを借りても、究極の目標は、違法シミュレーションとバイパスの難しさを高めることです。これらは、一般的に使用される方法を要約および要約できる機会です。この記事では、Javaに基づいて段階的にスライド検証コードを生成する方法に焦点を当てています。
スライディンググラフィック検証コードは、ブロック切断とブロックカッティングシャドウのある元の画像という2つの重要な写真で構成されていることがわかります。ここには、ブルート強化の難しさを確保するための2つの重要な機能があります。ブロック切断の形状と、ブロックが配置されている元の画像の位置はランダムです。これにより、ランダムで不規則に発見されたカットアウトと元の画像のペアリングを、限られた画像セットで作成できます。
コードを使用して、大きな画像から特定のランダム形状の小さな画像を抽出する方法は?
最初のステップは、将来の画像処理操作の実際の実行を容易にするために、カットアウト画像の概要を決定することです。
写真はピクセルで構成され、各ピクセルポイントは色に対応します。色はRGB形式に加えて透明性を表現し、平面図として画像を理解でき、左上隅を原点として、右x軸に、Y軸を下ると理解できます。この考慮事項に基づいて、アウトラインは2次元配列で表され、アウトライン内の要素値は1で、アウトライン外の要素値は0です。
この時点で、このアウトライン形状を生成する方法について考える必要があります。座標系、長方形、円があります。はい、数学的グラフィカル関数が使用されます。通常、円の関数方程式と長方形のサイドライン関数を使用して、次のように機能します。
(xa)²+(yb)²=r²には、3つのパラメーターa、b、およびrがあります。つまり、中心座標は(a、b)と半径rです。これらの切り抜きは上記の座標系に配置されており、グラフから特定の値を簡単に計算することができます。
サンプルコードは次のとおりです。
private 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; for(int i = 0; i <targetlength; i ++){for(int j = 0; j <ターゲットウィッド; 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; }}} return data; }2番目のステップは、このアウトラインの後、この2次元配列の値に基づいてカットアウトを決定し、元の画像の切り抜き位置に影を追加できることです。
操作は次のとおりです。
private void cutbytemplate(bufferedimage oriimage、bufferedimage Targetimage、int [] [] templateimage、int x、int y){for(int i = 0; i <targetlength; i ++){for(int j = 0; j <targetwidth; j ++){int rgb =テンプレートイメージ; //元の画像の対応する位置でのカラー変色プロセスint rgb_ori = oriimage.getRgb(x + i、y + j); if(rgb == 1){// cutout image 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); }}}}最初の2つのステップの後、カットアウトとカットアウトシャドウのある元の画像を取得します。混乱を増やし、ネットワークの読み込み効果を改善するには、画像のさらなる処理も必要です。一般的に、やるべきことが2つあります。 1つは画像を曖昧にし、機械認識の難しさを高めることであり、もう1つは同じ品質の適切な圧縮を実行することです。ファジー処理はガウスの曖昧さを簡単に考えることができ、原則は理解しやすいです。 Googleにアクセスして学ぶことができます。特にJavaの実装には、多くのバージョンがあります。現在、例を提供するサードパーティの瓶はありません。
public static convolveop getgaussianblurfilter(int radius、boolean horizontal){if(radius <1){show new IllegalargumentException( "radius be> = 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);フロート合計= 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; }カーネルカーネル= null; if(horizontal){kernel = new Kernel(size、1、data); } else {kernel = new Kernel(1、size、data); } new 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(); // writer iterator <imagewriter> iter = imageio.getImageWritersByFormatName(ImagType);を取得します。 ImageWriter writer =(imageWriter)iter.next(); //指定されたライター(ImageWriteParam)の出力パラメーター設定を取得しますimagewriteparam iwp = writer.getDefaultWriteParam(); iwp.setCompressionMode(ImageWriteParam.Mode_Explicit); // IWPを圧縮するかどうかを設定します。 //圧縮品質パラメーター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; }この時点で、スライド検証コードのコアのコード処理プロセスが完了しました。スライドエクスペリエンスの方が良くなるように、継続的に洗練され最適化できる多くの詳細があります。独自のスライド検証コードを作成する準備をしている一部の学生が役立つことを願っています。
上記のコードの実装は非常に洗練されています。一方で、パフォーマンスを確保するため、そして他方では理解しやすいです。さらに、さまざまな理由により、詳細が多すぎると便利ではありません。ご質問がある場合は、メッセージを残してコミュニケーションをとることができます。テスト後、スライドグラフィックスの生成のプロセス応答時間は約20msで制御できます。元の画像解像度が300px*150px未満の場合、約10msに達する可能性があります。これは許容範囲内です。より効率的な方法がある場合は、アドバイスをお願いします。また、誰もがwulin.comをもっとサポートすることを願っています。