تشترك الأمثلة الواردة في هذه المقالة في التعرف على بصمات الأصابع Java والتعرف على الصور للرجوع إليه. المحتوى المحدد كما يلي
الفئة الرئيسية:
استيراد java.awt.image.bufferedImage ؛ استيراد java.util.arraylist ؛ استيراد java.util.list ؛ فئة عامة مماثلة ishymagesearch { / ** * param args * / public static void main (string [] args) {list <string> hashcodes = new arraylist <) اسم ملف السلسلة = ImageHelper.path + "// images //" ؛ سلسلة hashcode = فارغة ؛ لـ (int i = 0 ؛ i <6 ؛ i ++) {hashcode = prodefingerprint (filename + "example" + (i + 1) + ".jpg") ؛ hashcodes.add (hashcode) ؛ } system.out.println ("الموارد:") ؛ system.out.println (hashcodes) ؛ system.out.println () ؛ String sourceHashCode = properffingerprint (filename + "source.jpg") ؛ System.out.println ("المصدر:") ؛ System.out.println (SourceHashCode) ؛ system.out.println () ؛ لـ (int i = 0 ؛ i <hashcodes.size () ؛ i ++) {int recoD = hammingDistance (sourcehashcode ، hashcodes.get (i)) ؛ System.out.print ("Hamming Distance:"+distral+"") ؛ if (difference == 0) {system.out.println ("source.jpg picture is as example exame"+(i+1)+". jpg") ؛ } آخر إذا (الفرق <= 5) {system.out.println ("source.jpg صورة تشبه إلى حد كبير مثال"+(i+1)+". jpg") ؛ } آخر إذا (الفرق <= 10) {system.out.println ("source.jpg صورة تشبه إلى حد ما مثال"+(i+1)+". jpg") ؛ } آخر إذا (الفرق> 10) {system.out.println ("Source.jpg صورة مختلفة تمامًا عن المثال"+(i+1)+". jpg") ؛ }}} /*** حساب "Hamming Cays". * إذا لم تتجاوز أجزاء البيانات المختلفة 5 ، فهذا يعني أن الصورتين متشابهتين جدًا ؛ إذا كانت أكبر من 10 ، فهذا يعني أن هذه صورتين مختلفتين. * param sourceHashCode Source HashCode * param hashcode المقارنة hashcode */ public static int hammingdistance (String sourceHashCode ، String hashcode) {int charget = 0 ؛ int len = sourceHashCode.length () ؛ لـ (int i = 0 ؛ i <len ؛ i ++) {if (sourcehashcode.charat (i)! = hashcode.charat (i)) {distr ++ ؛ }} اختلاف الإرجاع ؛ }/ *** إنشاء بصمة الإصبع* param filename filename* return phiginprint*/ properial static string productfingerprint (string fileName) {bufferedImage source = imageHelper.ReadPngImage (filename) ؛ ارتفاع int = 8 ؛ // الخطوة الأولى هي تقليل الحجم. // تقليص الصورة إلى 8 × 8 ، مع ما مجموعه 64 بكسل. الغرض من هذه الخطوة هو إزالة تفاصيل الصورة ، والاحتفاظ فقط بالمعلومات الأساسية مثل الهيكل والضوء والظلام ، والتخلي عن الاختلافات في الصورة التي تسببها أحجام ونسب مختلفة. bufferedImage Thumb = ImageHelper.thumb (المصدر ، العرض ، الارتفاع ، خطأ) ؛ // الخطوة الثانية هي تبسيط اللون. // تحويل الصورة المخفضة إلى المستوى 64 رمادي. وهذا يعني أن هناك 64 لونًا فقط في جميع وحدات البكسل. int [] pixels = new int [width * height] ؛ لـ (int i = 0 ؛ i <width ؛ i ++) {for (int j = 0 ؛ j <height ؛ j ++) {pixels [i * height+j] = ImageHelper.rgbtogray (thumb.getrgb (i ، j)) ؛ }} // الخطوة الثالثة هي حساب المتوسط. // حساب المتوسط الرمادي لجميع 64 بكسل. int Avgpixel = ImageHelper.Average (بكسل) ؛ // الخطوة 4 ، قارن بين الرماديين للبكسل. // قارن بين رمادي كل بكسل مع متوسط القيمة. إذا كان أكبر من أو يساوي متوسط القيمة ، فسيتم الإشارة إليها على أنها 1 ؛ إذا كانت أقل من متوسط القيمة ، فسيتم الإشارة إليها على أنها 0. int [] comps = new int [width * height] ؛ لـ (int i = 0 ؛ i <comps.length ؛ i ++) {if (pixels [i]> = avgpixel) {comps [i] = 1 ؛ } آخر {comps [i] = 0 ؛ }} // الخطوة 5 ، احسب قيمة التجزئة. // اجمع نتائج المقارنة للخطوة السابقة معًا لتشكيل عدد صحيح 64 بت ، وهو بصمة هذه الصورة. ترتيب المجموعات ليس مهمًا ، فقط تأكد من أن جميع الصور بنفس الترتيب. StringBuffer hashcode = new StringBuffer () ؛ لـ (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 بت. إرجاع hashcode.toString () ؛ } / ** * تحويل ثنائي إلى hex * param int binary * @regurn char hex * / private static char binarythex (int binary) {char ch = '' ؛ التبديل (ثنائي) {case 0: ch = '0' ؛ استراحة؛ الحالة 1: ch = '1' ؛ استراحة؛ الحالة 2: ch = '2' ؛ استراحة؛ الحالة 3: ch = '3' ؛ استراحة؛ الحالة 4: ch = '4' ؛ استراحة؛ الحالة 5: ch = '5' ؛ استراحة؛ الحالة 6: الفصل = '6' ؛ استراحة؛ الحالة 7: ch = '7' ؛ استراحة؛ الحالة 8: ch = '8' ؛ استراحة؛ الحالة 9: الفصل = '9' ؛ استراحة؛ الحالة 10: ch = 'a' ؛ استراحة؛ الحالة 11: ch = 'b' ؛ استراحة؛ الحالة 12: ch = 'c' ؛ استراحة؛ الحالة 13: ch = 'd' ؛ استراحة؛ الحالة 14: ch = 'e' ؛ استراحة؛ الحالة 15: ch = 'f' ؛ استراحة؛ الافتراضي: ch = '' ؛ } إرجاع الفصل ؛ }} أدوات:
استيراد java.awt.alphacomposite ؛ استيراد java.awt.color ؛ استيراد java.awt.font java.awt.image.colormodel ؛ import java.awt.image.writableraster ؛ import java.io javax.imageio.imageio ؛ استيراد com.sun.image.codec.jpeg.imageFormatexception ؛ استيراد com.sun.codec.jpeg.jpegcodec الفئة ، بشكل رئيسي لمعالجة صورة مائية * * Author 025079 * version [رقم الإصدار ، 2011-11-28] * see [الفئة/الطريقة ذات الصلة] * since [product/module إصدار] */الفئة العامة ImageHelper {// Project Root Pathory Patrint Static Path = System.getProperty ("user.dir") ؛ /** * إنشاء thumbnails <br/> * حفظ: imageio.write (bufferedImage ، imgtype [jpg/png/...] ، ملف) ؛ * * param source * صورة أصلية * param عرض * عرض Thumbnail * ارتفاع Thumbnail * ارتفاع Thumbnail * param b * هل هو مقاس على قدم المساواة *// public static bufferedimage thumb (مصدر bufferedImage ، عرض int ، int ، boolean b) {targew ، targeth enludal enduge and width type type ؛ الهدف bufferedImage = فارغ ؛ double sx = (double) width / source.getWidth () ؛ double sy = (مزدوج) الارتفاع / source.getheight () ؛ if (b) {if (sx> sy) {sx = sy ؛ العرض = (int) (sx * source.getWidth ()) ؛ } آخر {sy = sx ؛ الارتفاع = (int) (sy * source.getheight ()) ؛ }} if (type == bufferedimage.type_custom) {// handmade colormodel cm = source.getColorModel () ؛ Writableraster Raster = cm.CreateCompatibleWritableraster (العرض ، الارتفاع) ؛ boolean alphapremultiplied = cm.isalphapremultiplied () ؛ الهدف = جديد bufferedImage (cm ، Raster ، alphapremultiplied ، null) ؛ } الهدف الآخر = جديد 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 * علامة مائية في الزاوية اليسرى العليا من الصورة ، القيمة الإحدادية x من العلامة المائية y * param y في الزاوية اليسرى العليا من الصورة y static inting alpha alpha * watermarmency 0.1f ~ 1.0f * / public. x ، int y ، float alpha) {try {// تحميل صورة ملف الصورة المعلقة img = imageio.read (ملف جديد (imgpath)) ؛ صورة bufferedImage = جديد 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 () ؛ // احفظ ملف fileOutputStream المعالج Out = جديد fileOutputStream (imgpath) ؛ jpegimageencoder encoder = jpegcodec.createjpegencoder (out) ؛ Encoder.encode (Image) ؛ out.close () ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ } ستر */ textmark public static void (سلسلة ImgPath ، نص سلسلة ، خط الخط ، لون اللون ، int x ، int y ، float alpha) {try {font dfont = (font == null)؟ خط جديد ("宋体" ، 20 ، 13): الخط ؛ Image IMG = Imageio.Read (ملف جديد (imgpath)) ؛ صورة bufferedImage = جديد bufferedImage (img.getWidth (null) ، img.getheight (null) ، bufferedImage.type_int_rgb) ؛ graphics2d g = image.creategraphics () ؛ G.DrawImage (img ، 0 ، 0 ، null) ؛ G.SetColor (اللون) ؛ G.SetFont (dfont) ؛ G.SetComposite (Alphacomposite.getInstance (Alphacomposite.src_atop ، alpha)) ؛ G.DrawString (النص ، x ، y) ؛ G.Dispose () ؛ FileOutputStream Out = new FileOutputStream (IMGPath) ؛ jpegimageencoder encoder = jpegcodec.createjpegencoder (out) ؛ Encoder.encode (Image) ؛ out.close () ؛ } catch (استثناء e) {system.out.println (e) ؛ }} / *** اقرأ صورة JPEG* param filename filename* @return bufferedimage كائن صورة* / public static bufferedImage readjPegImage (اسم ملف السلسلة) {try {inputStream imageIn = new FileInputStream (ملف جديد (filename)) ؛ // احصل على مشفر الإدخال وترميز دفق الملف بتنسيق JPG JPegimagedEcoder = jpegcodec.createjpegdecoder (Imagein) ؛ // الحصول على كائن الصورة المشفرة bufferedimage sourceMage = decoder.decodeasbufferedImage () ؛ إرجاع المصدر. } catch (fileNotFoundException e) {e.printStackTrace () ؛ } catch (imageFormatexception e) {e.printStackTrace () ؛ } catch (ioException e) {E.PrintStackTrace () ؛ } إرجاع فارغ ؛ } / *** اقرأ صورة JPEG* اسم filename filename* return bufferedImage كائن* / public static bufferedImage readPngImage (اسم ملف السلسلة) {try {file inputFile = new file (filename) ؛ bufferedImage SourceImage = imageio.read (inputFile) ؛ إرجاع المصدر. } catch (fileNotFoundException e) {e.printStackTrace () ؛ } catch (imageFormatexception e) {e.printStackTrace () ؛ } catch (ioException e) {E.PrintStackTrace () ؛ } إرجاع فارغ ؛ } / *: int _red = (pixels >> 16) & 0xff ؛ int _green = (pixels >> 8) & 0xff ؛ int _blue = (pixels) & 0xff ؛ return (int) (0.3 * _red + 0.59 * _green + 0.11 * _blue) ؛ } / *** احسب متوسط صفيف الصفيف* param pixels* return int inter* / public static int meverugle (int [] pixels) {float m = 0 ؛ لـ (int i = 0 ؛ i <pixels.length ؛ ++ i) {m += pixels [i] ؛ } m = m / pixels.length ؛ العودة (int) م ؛ }}ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.