تصف هذه المقالة طريقة Java لإضافة علامات مياه الصور والعلامات المائية النصية والفسيفساء إلى الصور. شاركه للرجوع إليه ، على النحو التالي:
يمكنك إنشاء فئة utils جديدة في Eclipse ، ونسخ الكود التالي واستخدامه مباشرة ، وتدرك الطريقة التالية إضافة علامات مائية واحدة أو متعددة.
package com.rzxt.fyx.common.Util ؛ استيراد java.awt.alphacomposite ؛ استيراد java.awt.color ؛ استيراد java.awt.font ؛ import java.awt.graphics2d ؛ import java.awt.awt.awt. java.io.file ؛ import javax.imageio.imageio ؛ import javax.swing.imageicon ؛/** * إضافة علامة مائية إلى الصورة * author tgy * */public class markimageutils {/** * param args */public static void main (string) {args) String Source = "F: /Images/6.jpg" ؛ // Source Path Path String icon = "F: /Images/ICON2.PNG" ؛ // Overcover Path Path String ImageName = "mark_image" ؛ // صورة اسم سلسلة ImageType = "JPG" ؛ // نوع الصورة JPG ، JPEG ، PNG ، GIF String Text = "Watermarked" ؛ حجم int = 4 ؛ // حجم عدد صحيح حجم الفسيفساء = فارغة ؛ // زاوية دوران العلامة المائية هي -45 ، يعني فارغة عدم تدوير نتيجة السلسلة = فارغة ؛ // إضافة علامة مائية الصورة إلى نتيجة الصورة = markimageutils.markimagebyoricon (أيقونة ، المصدر ، الإخراج ، imageName ، ImageType ، درجة) ؛ // النتيجة = MarkImageUtils.MarkImageBysingleicon (أيقونة ، المصدر ، الإخراج ، ImageName ، ImageType ، درجة) ؛ // أضف علامة مائية نص إلى الصورة // النتيجة = markimageUtils.MarkImagebyMoretext (المصدر ، الإخراج ، imageNype ، leactype ، color.red ، النص ، الدرجة) ؛ MarkImageUtils.MarkImagebyMosaic (المصدر ، الإخراج ، imageName ، ImageType ، الحجم) ؛ System.out.println (نتيجة) ؛ }/** * أضف علامات مائية متعددة صورة إلى مواقع مختلفة من الصورة ، وتعيين زاوية الدوران لصورة العلامة المائية * param param path watermark path (مثل: f:/emages/icon.png) * param path path path kipearm (eacharm exame/eacharam (eignampares/eacharam @phage. AS: 11111) * param imageType type (مثل: jpg) * درجة param زاوية التناوب في صورة العلامة المائية ، لا يعني فارغ أي دوران */ سلسلة ثابتة عامة markimagebymoreicon (أيقونة السلسلة ، مصدر السلسلة ، السلسلة ، خيال السلسلة ، سلسلة خيال ، درجة حرارة) حاول {file file = ملف جديد (Source) ؛ ملف ficon = ملف جديد (أيقونة) ؛ if (! file.isfile ()) {return source + "ليس ملف صورة!" ؛ } // قم بتحميل الأيقونة في صورة الذاكرة IC = Imageio.read (fiCon) ؛ // ارتفاع أيقونة int iheight = ic.getheight (null) ؛ // اقرأ الصورة المصدر في صورة الذاكرة IMG = imageio.read (ملف) ؛ // عرض الصورة int width = img.getWidth (null) ؛ // ارتفاع الصورة int = img.getheight (null) ؛ BufferedImage BI = جديد BufferEdImage (العرض ، الارتفاع ، bufferedImage.type_int_rgb) ؛ // قم بإنشاء كائن Graphics2D مع graphics2d graphics2d g = bi.creategraphics () ؛ // x ، الإعدادات الافتراضية المحور y للبدء من 0 إحداثيات int x = 0 ؛ int y = 0 ؛ // ارتفاع الفاصل بين الصورتين المائيتين هو 1/3 من صورة العلامة المائية int temp = iheight/3 ؛ int مساحة = 1 ؛ if (height> = iHeight) {Space = height/iHeight ؛ if (Space> = 2) {temp = y = iHeight/2 ؛ if (Space == 1 || Space == 0) {x = 0 ؛ y = 0 ؛ }}} آخر {x = 0 ؛ y = 0 ؛ } // قم بتعيين معالجة الحافة المسننة لقطاع الخط G.SetRenderingHint (renderingHints.Key_Interpolation ، renderinghints.value_interpolation_bilinear) ؛ // تمثل صورة وتحويلها من مساحة الصورة إلى مساحة المستخدم قبل رسم g.drawImage (img.getScaledInstance (العرض ، الارتفاع ، Image.scale_smooth) ، 0،0 ، null) ؛ لـ (int i = 0 ؛ i <Space ؛ i ++) {if (null! = degate) {// قم بتعيين علامة مائية g.rotate (math.toradians (درجة) ، (مزدوجة) bi.getWidth () / 2 ، (مزدوج) } // مسار صورة العلامة المائية عمومًا GIF أو PNG ، بحيث يمكن تعيين الشفافية Imgicon Imgicon = new imageicon (أيقونة) ؛ // احصل على كائن الصورة. الصورة con = imgicon.getImage () ؛ // الشفافية ، الحد الأدنى القيمة هو 0 ، القيمة القصوى هي الوضوح 1 العائم = 0.6F ؛ G.SetComposite (Alphacomposite.getInstance (Alphacomposite.src_atop ، Clarity)) ؛ // تشير إلى موضع الإحداثيات لصورة العلامة المائية (x ، y) //g.drawimage(con ، 300 ، 220 ، null) ؛ G.DrawImage (con ، x ، y ، null) ؛ G.SetComposite (Alphacomposite.getInstance (Alphacomposite.src_over)) ؛ y+= (icheight+temp) ؛ } g.dispose () ؛ ملف SF = ملف جديد (الإخراج ، ImageName+"."+ImageType) ؛ imageio.write (BI ، ImageType ، SF) ؛ // حفظ نتيجة الصورة = "تتم إضافة علامة مائية Icon بعد اكتمال الصورة" ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ } نتيجة الإرجاع ؛ }/** * أضف علامة مائية صورة واحدة إلى الصورة ، وقم بتعيين زاوية دوران صورة العلامة المائية * param param path watermark path (مثل: f:/emages/icon.png) * param path path path path بدون علامة مائية (مثل: f: params/parame @parame come (parame is is is is is is is is is is is is is is eghate. 11111) * param نوع صورة ImageType (مثل: jpg) * param درجة الزاوية التناوب في صورة العلامة المائية ، لا يعني Null أي دوران */ سلسلة ثابتة في MarkImagebysingleicon (أيقونة السلسلة ، مصدر السلسلة ، سلسلة خيال السلسلة ، سلسلة خيال ، درجة حرارة). حاول {file file = ملف جديد (Source) ؛ ملف ficon = ملف جديد (أيقونة) ؛ if (! file.isfile ()) {return source + "ليس ملف صورة!" ؛ } // قم بتحميل الأيقونة في صورة الذاكرة IC = Imageio.read (fiCon) ؛ // ارتفاع أيقونة int iheight = ic.getheight (null) ؛ // اقرأ الصورة المصدر في صورة الذاكرة IMG = imageio.read (ملف) ؛ // عرض الصورة int width = img.getWidth (null) ؛ // ارتفاع الصورة int = img.getheight (null) ؛ BufferedImage BI = جديد BufferEdImage (العرض ، الارتفاع ، bufferedImage.type_int_rgb) ؛ // قم بإنشاء كائن Graphics2D مع bufferedimage المحدد. graphics2d g = bi.creategraphics () ؛ // x ، الإعدادات الافتراضية المحور y للبدء من 0 إحداثيات int x = 0 ؛ int y = (الارتفاع/2)-(iheight/2) ؛ // قم بتعيين معالجة الحافة المسننة لقطاع الخط G.SetRenderingHint (renderinghints.key_interpolation ، renderinghints.value_interpolation_bilinear) ؛ // تمثل صورة وتحويلها من مساحة الصورة إلى مساحة المستخدم قبل رسم g.drawImage (img.getScaledInstance (العرض ، الارتفاع ، Image.scale_smooth) ، 0،0 ، null) ؛ if (null! = درجة) {// قم بتعيين العلامة المائية G.Rotate (Math.Toradians (درجة) ، (مزدوجة) bi.getWidth () / 2 ، (مزدوجة) bi.getheight () / 2) ؛ } // مسار صورة العلامة المائية عمومًا GIF أو PNG ، لذلك يمكن تعيين الشفافية Imgicon Imgicon = New ImageIcon (Icon) ؛ // احصل على كائن الصورة. الصورة con = imgicon.getImage () ؛ // الشفافية ، الحد الأدنى القيمة هو 0 ، القيمة القصوى هي الوضوح 1 العائم = 0.6F ؛ G.SetComposite (Alphacomposite.getInstance (Alphacomposite.src_atop ، Clarity)) ؛ // تشير إلى موضع الإحداثيات لصورة العلامة المائية (x ، y) //g.drawimage(con ، 300 ، 220 ، null) ؛ G.DrawImage (con ، x ، y ، null) ؛ G.SetComposite (Alphacomposite.getInstance (Alphacomposite.src_over)) ؛ G.Dispose () ؛ ملف SF = ملف جديد (الإخراج ، ImageName+"."+ImageType) ؛ imageio.write (BI ، ImageType ، SF) ؛ // حفظ نتيجة الصورة = "تتم إضافة علامة مائية Icon بعد الانتهاء من الصورة" ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ } نتيجة الإرجاع ؛ }/** * أضف علامات مياه نصية متعددة إلى الصورة ، وتعيين زاوية دوران النص المائية * param مصدر مسار الصورة الذي يجب إضافته (مثل: f:/emages/6.jpg) * @param إخراج مسار إخراج الصورة بعد إضافة علامة ماء (مثل:/صور/) param. param color لون نص علامة مائية* param word text watermark* @param درجة زاوية التناوب لنص العلامة المائية ، مما يعني عدم وجود دوران*/ سلسلة ثابتة عامة markimagebymoretext (مصدر السلسلة ، إخراج السلسلة ، خيوط الخيط ، خيوط خيال ، لون لون ، كلمة سلسلة ، حاول {// قراءة ملف ملف معلومات الصورة الأصلي = ملف جديد (مصدر) ؛ if (! file.isfile ()) {return file + "ليس ملف صورة!" ؛ } صورة img = imageio.read (ملف) ؛ // عرض الصورة int width = img.getWidth (null) ؛ // ارتفاع الصورة int = img.getheight (null) ؛ // size size int size = 50 ؛ // إضافة العلامة المائية BufferedImage BI = جديد bufferedImage (العرض ، الارتفاع ، bufferedImage.type_int_rgb) ؛ graphics2d g = bi.creategraphics () ؛ G.DrawImage (IMG ، 0 ، 0 ، العرض ، الارتفاع ، فارغ) ؛ . // اضبط لون العلامة المائية وفقًا لخلفية الصورة G.SetColor (اللون) ؛ int x = العرض/3 ؛ int y = الحجم ؛ int مساحة = الارتفاع/الحجم ؛ لـ (int i = 0 ؛ i <Space ؛ i ++) {// إذا كان المحور y للإحداثي الأخير أعلى من الارتفاع ، والخروج مباشرة إذا ((y+size)> الارتفاع) {break ؛ } if (null! = degate) {// قم بتعيين التناوب المائي g.rotate (math.toradians (درجة) ، (مزدوج) bi.getWidth () / 2 ، (مزدوج) bi.getheight () / 2) ؛ } g.setfont (الخط) ؛ // موقع المائية G.DrawString (كلمة ، x ، y) ؛ y+= (2*الحجم) ؛ } g.dispose () ؛ // إخراج ملف صورة sf = ملف جديد (إخراج ، ImageName+"."+ImageType) ؛ imageio.write (BI ، ImageType ، SF) ؛ // حفظ الصورة = "أضف علامة مائية Word بعد إكمال الصورة" ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ } نتيجة الإرجاع ؛ }/** * أضف علامة مائية نصية واحدة إلى الصورة ، وقم بتعيين زاوية دوران نص العلامة المائية * param مصدر مسار الصورة الذي يجب إضافته بعلامة مائية (مثل: f: /emages/6.jpg) jpg)* param color لون نص علامة مائية* param word text text* param درجة زاوية دوران النص المائي ، مما يعني عدم وجود دوران*/ سلسلة ثابتة عامة markimageBySeNgeText (مصدر السلسلة ، إخراج السلسلة ، خيال السلسلة ، سلسلة خيوط ، لون الألوان ، كلمة سلسلة ، حاول {// قراءة ملف ملف معلومات الصورة الأصلي = ملف جديد (مصدر) ؛ if (! file.isfile ()) {return file + "ليس ملف صورة!" ؛ } صورة img = imageio.read (ملف) ؛ عرض int = img.getWidth (null) ؛ ارتفاع int = img.getheight (null) ؛ // إضافة العلامة المائية BufferedImage BI = جديد bufferedImage (العرض ، الارتفاع ، bufferedImage.type_int_rgb) ؛ graphics2d g = bi.creategraphics () ؛ G.DrawImage (IMG ، 0 ، 0 ، العرض ، الارتفاع ، فارغ) ؛ . // اضبط لون العلامة المائية وفقًا لخلفية الصورة G.SetColor (اللون) ؛ if (null! = درجة) {// قم بتعيين العلامة المائية G.Rotate (Math.Toradians (درجة) ، (مزدوجة) bi.getWidth () / 2 ، (مزدوجة) bi.getheight () / 2) ؛ } g.setfont (الخط) ؛ int x = العرض/3 ؛ int y = الارتفاع/2 ؛ // موقع المائية G.DrawString (كلمة ، x ، y) ؛ G.Dispose () ؛ // إخراج ملف صورة sf = ملف جديد (إخراج ، ImageName+"."+ImageType) ؛ imageio.write (BI ، ImageType ، SF) ؛ // حفظ الصورة = "أضف علامة مائية Word بعد إكمال الصورة" ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ } نتيجة الإرجاع ؛ }/** * أضف Mosaic إلى الصورة * param المصدر مسار الصورة الأصلي (مثل: f: /emages/6.jpg) * @param الإخراج بعد mosaing ، المسار لحفظ الصورة (مثل: f:/images/) * @param اسم صورة (مثل: مثل: param imageype system ارتفاع كل مستطيل * @REGURN */ سلسلة ثابتة عامة markimagebymosaic (مصدر السلسلة ، إخراج السلسلة ، الخيط الخيط ، سلسلة خيول ، حجم int) {string result = "حدث خطأ الفسيفساء صورة" ؛ حاول {file file = ملف جديد (Source) ؛ if (! file.isfile ()) {return file + "ليس ملف صورة!" ؛ } bufferedImage img = imageio.read (file) ؛ // اقرأ عرض الصورة int = img.getWidth (null) ؛ // عرض الصورة الأصلي int = img.getheight (null) ؛ . // حجم شبكة الفسيفساء كبير جدًا أو صغير جدًا إذا (العرض <size || الارتفاع <size) {return "حجم شبكة الفسيفساء كبير جدًا" ؛ } if (size <= 0) {return "حجم شبكة الفسيفساء صغيرة جدًا" ؛ } int xcount = 0 ؛ // ارسم الرقم في X Direction int ycount = 0 ؛ // ارسم الرقم في الاتجاه y إذا (العرض ٪ size == 0) {xCount = width /size ؛ } آخر {xCount = width / size + 1 ؛ } if (ارتفاع ٪ size == 0) {ycount = الارتفاع / الحجم ؛ } آخر {ycount = الارتفاع / الحجم + 1 ؛ } int x = 0 ؛ ] لـ (int i = 0 ؛ i <xcount ؛ i ++) {for (int j = 0 ؛ j <ycount ؛ j ++) {// mosaic stistangle size int mwidth = size ؛ int mheight = الحجم ؛ if (i == xcount-1) {// آخر واحد في الاتجاه الأفقي لا يكفي لحجم واحد mwidth = width-x ؛ } if (j == ycount-1) {// آخر واحد في الاتجاه العمودي لا يكفي لحجم واحد mheight = height-y ؛ } // قيمة RGB للون المستطيل تأخذ البكسل المركزي int centerx = x ؛ int centery = y ؛ if (mwidth ٪ 2 == 0) {centerx += mwidth / 2 ؛ } آخر {centerx += (mwidth - 1) / 2 ؛ } if (mheight ٪ 2 == 0) {centery += mheight / 2 ؛ } آخر {centery += (mheight - 1) / 2 ؛ } لون اللون = لون جديد (img.getrgb (centerx ، centery)) ؛ G.SetColor (اللون) ؛ G.FillRect (x ، y ، mwidth ، mheight) ؛ y = y + size ؛ // احسب إحداثي y للمستطيل التالي} y = 0 ؛ // استعادة الإحداثي y x = x + size ؛ // احسب الإحداثيات x} g.dispose () ؛ ملف SF = ملف جديد (الإخراج ، ImageName+"."+ImageType) ؛ imageio.write (BI ، ImageType ، SF) ؛ // حفظ نتيجة الصورة = "نجاح الفسيفساء" ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ } نتيجة الإرجاع ؛ }}لمزيد من المحتوى المتعلق بـ Java ، يمكن للقراء المهتمين بهذا الموقع عرض الموضوعات: "ملخص مهارات تشغيل صور Java" ، "ملخص لمهارات تشغيل Java ووقت التشغيل" ، "ملخص لمهارات عقدة Java DOM" ، "ملخص ملف Java ومهارات تشغيل الدليل" و "برامج بيانات Java" و Algorithm.
آمل أن يكون هذا المقال مفيدًا لبرمجة Java للجميع.