이 기사의 예제는 참조에 대한 Java 지문 인식 및 이미지 인식의 소스 코드를 공유합니다. 특정 내용은 다음과 같습니다
주요 카테고리 :
import java.awt.image.bufferedimage; import java.util.arraylist; import java.util.list; public class importimagesearch { / ** * @param args * / public static void main (string [] args) {list <string> hashcodes = new arraylist> (); 문자열 filename = imageHelper.Path + "// image //"; 문자열 hashcode = null; for (int i = 0; i <6; i ++) {hashcode = producefingerprint (filename + "example" + (i + 1) + ".jpg"); hashcodes.add (hashcode); } system.out.println ( "Resources :"); System.out.println (Hashcodes); System.out.println (); String SourceHashCode = ProduceFingerPrint (filename + "source.jpg"); System.out.println ( "출처 :"); System.out.println (SourceHashCode); System.out.println (); for (int i = 0; i <hashcodes.size (); i ++) {int different = hammingdistance (sourcehashcode, hashcodes.get (i)); System.out.print ( "해밍 거리 :"+차이+""); if (차이 == 0) {system.out.println ( "source.jpg 사진은 예"+(i+1)+". jpg"); } else if (차이 <= 5) {System.out.println ( "source.jpg 이미지는"+(i+1)+". jpg"); } else if (차이 <= 10) {System.out.println ( "source.jpg image image"example "+(i+1)+". jpg "); } else if (차이> 10) {system.out.println ( "source.jpg image 이미지"+(i+1)+". jpg"); }}} /*** "해밍 거리"를 계산합니다. * 다른 데이터 비트가 5를 초과하지 않으면 두 그림이 매우 유사하다는 것을 의미합니다. 그들이 10보다 큰 경우, 이것들은 두 개의 다른 그림임을 의미합니다. * @param sourcehashcode 소스 해시 코드 * @param 해시 코드 비교 해시 코드 */ public static int hammingdistance (String SourceHashCode, String Hashcode) {int differem = 0; int len = sourceHashCode.length (); for (int i = 0; i <len; i ++) {if (sourcehashcode.charat (i)! = hashcode.charat (i)) {차이 ++; }} 반환 차이; }/ *** im int 높이 = 8; // 첫 번째 단계는 크기를 줄이는 것입니다. // 총 64 개의 픽셀로 이미지를 8x8 크기로 줄입니다. 이 단계의 목적은 그림의 세부 사항을 제거하고 구조, 밝고 어두운 구조와 같은 기본 정보 만 유지하며 다양한 크기와 비율로 인한 그림의 차이를 포기하는 것입니다. BufferedImage thumb = imageHelper.thumb (소스, 너비, 높이, 거짓); // 두 번째 단계는 색상을 단순화하는 것입니다. // 감소 된 이미지를 레벨 64 그레이 스케일로 바꿉니다. 즉, 모든 픽셀에는 64 개의 색상 만 있습니다. int [] pixels = new int [너비 * 높이]; for (int i = 0; i <width; i ++) {for (int j = 0; j <height; j ++) {pixels [i * height+j] = imageHelper.rgBtogray (jumm.getrgb (i, j)); }} // 세 번째 단계는 평균을 계산하는 것입니다. // 모든 64 픽셀의 회색차 평균을 계산합니다. int avgpixel = imageHelper.Average (픽셀); // 4 단계, 픽셀의 회색 스케일을 비교하십시오. // 각 픽셀의 그레이 스케일을 평균 값과 비교하십시오. 평균값보다 크거나 같으면 1으로 표시됩니다. 평균값보다 작 으면 0. int [] comps = new int [width * height]로 표시됩니다. for (int i = 0; i <comps.length; i ++) {if (pixels [i]> = avgpixel) {comps [i] = 1; } else {comps [i] = 0; }} // 5 단계, 해시 값을 계산합니다. // 이전 단계의 비교 결과를 결합 하여이 그림의 지문 인 64 비트 정수를 형성합니다. 조합 순서는 중요하지 않습니다. 모든 사진이 동일한 순서인지 확인하십시오. StringBuffer hashcode = new StringBuffer (); for (int i = 0; i <comps.length; i + = 4) {int result = comps [i] * (int) math.pow (2, 3) + comps [i + 1] * (int) math.pow (2, 2) + comps [i + 2] * (int) math.pow (2, 1) + comps [i + 2]; hashcode.append (binarytoHex (결과)); } // 지문을받은 후 다른 그림을 비교하여 64 비트에서 얼마나 많은 비트가 다른지 확인할 수 있습니다. return hashcode.tostring (); } / ** * 바이너리 변환 바이너리 변환 * @param int binary * @return char hex * / private static char binarytohex (int binary) {char ch = ''; 스위치 (바이러스) {case 0 : ch = '0'; 부서지다; 사례 1 : ch = '1'; 부서지다; 사례 2 : ch = '2'; 부서지다; 사례 3 : ch = '3'; 부서지다; 사례 4 : ch = '4'; 부서지다; 사례 5 : ch = '5'; 부서지다; 사례 6 : ch = '6'; 부서지다; 사례 7 : ch = '7'; 부서지다; 사례 8 : ch = '8'; 부서지다; 사례 9 : ch = '9'; 부서지다; 사례 10 : ch = 'a'; 부서지다; 사례 11 : ch = 'b'; 부서지다; 사례 12 : ch = 'c'; 부서지다; 사례 13 : ch = 'd'; 부서지다; 사례 14 : ch = 'e'; 부서지다; 사례 15 : ch = 'f'; 부서지다; 기본값 : ch = ''; } 반환 ch; }} 도구 :
import java.awt.alphacomposite; import java.awt.color; import java.awt.font; import java.awt.graphics2d; import java.awt.image; import java.awt.renderinghints; import java.awt.geom.affinetransform; import java.awt.image.mage.mage.mage.mage java.awt.image.colormodel; import java.awt.image.writableraster; import java.io.file; import java.io.fileinputstream; import java.io.filenotfoundexception; import java.io.fileoutputstream; import java.io.ioexception; import java.io.io.inputstream; javax.imageio.imageio; import com.sun.image.codec.jpeg.imageformatexception; import com.sun.image.codec.jpeg.jpegcodec; import com.sun.image.codec.jpeg.jpegimagedecoder; import com.sun.image.codec.jpegeg 클래스, 주로 이미지 워터 마크 처리 * * @Author 025079 * @version [버전 번호, 2011-11-28] * @see [관련 클래스/메소드] * @since [제품/모듈 버전] */public class imageHelper {// provote root directory path public final String path = system.getProperty ( "user.dir"); /** * 썸네일 생성 <br/> * 저장 : imageio.write (bufferedImage, imgtype [jpg/png/...], file); * * @param 소스 * 원본 이미지 * @param width * 썸네일 너비 * 썸네일 높이 * 썸네일 높이 * @param b * */ public static bufferedimage jmumb (bufferedImage 소스, int 너비, int 높이, 부울 b) {// targetw, width를 나타냅니다. BufferedImage target = null; Double SX = (Double) 너비 / source.getWidth (); 이중 sy = (이중) 높이 / source.getheight (); if (b) {if (sx> sy) {sx = sy; 너비 = (int) (sx * source.getWidth ()); } else {sy = sx; 높이 = (int) (sy * source.getheight ()); }} if (type == bufferedImage.type_custom) {// 수제 colormodel cm = source.getColorModel (); Writaberaster Raster = C.CreateCompatibleWritableraster (너비, 높이); 부울 알파 프레 배트 = cm.isalphapremultiplied (); target = new bufferedImage (cm, 래스터, alphapremultiplied, null); } else target = new bufferedImage (너비, 높이, 유형); Graphics2d g = target.creategraphics (); // exlax보다 부드럽게 : G.SetRenderingHint (renderingHints.Key_Rendering, renderingHints.Value_render_quality); G.DrawRenderEdImage (Source, AffinetRansform.getScaleInstance (SX, SY)); g.dispose (); 반환 대상; } / ** * 이미지 워터 마크 * * @param imgpath * 보류 이미지 * @param Markpath * 워터 마크 이미지 * @param x * watermark 이미지의 왼쪽 상단에 @param y * watermark의 x 좌표 값은 이미지의 왼쪽 상단 코너에 있습니다. x, int y, float alpha) {try {// 보류중인 이미지 파일 이미지 img = imageio.read (새 파일 (imgpath)); bufferedImage image = new bufferedImage (img.getWidth (null), img.getheight (null), bufferedImage.type_int_rgb); Graphics2d g = image.creategraphics (); G.DrawImage (IMG, 0, 0, NULL); // 워터 마크 이미지 파일 이미지를로드 src_biao = imageio.read (새 파일 (MarkPath)); g.setcomposite (alphacomposite.getinstance (alphacomposite.src_atop, alpha)); G.DrawImage (src_biao, x, y, null); g.dispose (); // 처리 된 파일을 저장 파일 outputStream out = new FileOutputStream (imgpath); jpegimageEncoder encoder = jpegcodec.createjpegencoder (out); encoder.encode (이미지); out.close (); } catch (예외 e) {e.printstacktrace (); }} /** * 텍스트 워터 마크 * * @param imgpath * 보류 이미지 * @param text * 워터 마크 텍스트 * @param font * watermark font information * @param color * watermark font color * @param x * watermark x coderinate 값 그림의 왼쪽 상단 값에 있습니다. */ public static void textmark (문자열 imgpath, 문자열 텍스트, 글꼴 글꼴, 색상, int x, int y, float alpha) {try {font dfont = (font == null)? 새 글꼴 ( "" ", 20, 13) : 글꼴; image img = imageio.read (새 파일 (imgpath)); bufferedImage image = new bufferedImage (img.getWidth (null), img.getheight (null), bufferedImage.type_int_rgb); Graphics2d g = image.creategraphics (); G.DrawImage (IMG, 0, 0, NULL); G. 세트 컬러 (색); G. 세트 폰트 (dfont); g.setcomposite (alphacomposite.getinstance (alphacomposite.src_atop, alpha)); G.DrawString (텍스트, X, Y); g.dispose (); fileoutputStream out = 새 FileOutputStream (imgpath); jpegimageEncoder encoder = jpegcodec.createjpegencoder (out); encoder.encode (이미지); out.close (); } catch (예외 e) {System.out.println (e); }} / *** jpeg image 읽기* @param filename filename* @return bufferedimage image 객체* / public static bufferedimage readjpegimage (string filename) {try {inputstream imagein = new FileInputStream (filename)); // 입력 인코더를 가져 와서 파일 스트림을 JPG 형식으로 인코딩합니다. // 인코딩 된 이미지 개체를 가져옵니다. BufferedImage sourceImage = decoder.decodeasbufferedImage (); Return SourceImage; } catch (filenotfoundException e) {e.printstacktrace (); } catch (ImageFormateXception e) {e.printstacktrace (); } catch (ioexception e) {e.printstacktrace (); } return null; } / *** jpeg 사진 읽기* @param filename filename* @return bufferedImage 이미지 개체* / public static bufferedImage readpngimage (string filename) {try {file inputfile = new File (filename); bufferedImage sourceImage = imageio.read (inputfile); Return SourceImage; } catch (filenotfoundException e) {e.printstacktrace (); } catch (ImageFormateXception e) {e.printstacktrace (); } catch (ioexception e) {e.printstacktrace (); } return null; } / *** 그레이 스케일 값 계산* @param 픽셀 픽셀* @return int grayscale value* / public static int rgbtogray (int pixels) {// int _alpha = (픽셀 >> 24) & 0xff; int _RED = (픽셀 >> 16) & 0xff; int _green = (픽셀 >> 8) & 0xff; int _blue = (픽셀) & 0xff; return (int) (0.3 * _red + 0.59 * _green + 0.11 * _blue); } / *** 배열의 평균 계산* @param pixels array* @return int 평균* / public static int 평균 (int [] 픽셀) {float m = 0; for (int i = 0; i <pixels.length; ++ i) {m += 픽셀 [i]; } m = m / pixels.length; 리턴 (int) m; }}위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.