บทความนี้อธิบายถึงวิธีการ Java ในการเพิ่มลายน้ำภาพลายน้ำข้อความและโมเสคลงในภาพ แบ่งปันสำหรับการอ้างอิงของคุณดังนี้:
คุณสามารถสร้างคลาส UTILS ใหม่ใน Eclipse คัดลอกรหัสต่อไปนี้และใช้โดยตรงและวิธีการต่อไปนี้ตระหนักถึงการเพิ่มลายน้ำเดี่ยวหรือหลายครั้ง
แพ็คเกจ com.rzxt.fyx.common.util; นำเข้า java.awt.alphacomposite; นำเข้า java.awt.color; นำเข้า java.awt.font; นำเข้า java.awt.graphics2d; นำเข้า java.awt.image; นำเข้า Java.awt.renderinghints; java.io.file; นำเข้า javax.imageio.imageio; นำเข้า Javax.swing.imageicon;/** * เพิ่มลายน้ำลงในภาพ * @author tgy * */คลาสสาธารณะ markimageutils {/** * @param args */public Static Main สตริงแหล่งที่มา = "f:/images/6.jpg"; // แหล่งที่มาของภาพพา ธ สตริง = "f: /images/icon2.png"; // overcover image path String imagename = "mark_image"; // ชื่อสตริงภาพ imageType = "jpg"; // ประเภทภาพ jpg, jpeg, png, ข้อความสตริง gif = "ลายน้ำ"; ขนาด int = 4; // mosaic ขนาดจำนวนเต็มองศา = null; // มุมการหมุนลายน้ำคือ -45, null หมายถึงการไม่หมุนสตริงผลลัพธ์ = null; // เพิ่มภาพลายน้ำลงในภาพผลลัพธ์ = MarkimageUtils.markimageBymoreicon (ไอคอน, แหล่งที่มา, เอาต์พุต, imageName, imageType, ระดับ); // result = markimageUtils.markimageBysingleicon (ไอคอน, แหล่งที่มา, เอาต์พุต, imageName, imageType, ระดับ); // เพิ่มลายน้ำข้อความลงในภาพ // result = markimageUtils.markimageByMoretext (แหล่งที่มา, เอาต์พุต, imageName, imageType, color.red, ข้อความ, ระดับ); // result = markimageTils.markimagybysingletext (แหล่งที่มา, output, imagename, imagetype MarkimageUtils.markimageByMosaic (แหล่งที่มา, เอาต์พุต, imageName, imageType, ขนาด); System.out.println (ผลลัพธ์); }/** * เพิ่มลายน้ำหลายภาพไปยังตำแหน่งต่าง ๆ ของภาพและตั้งมุมการหมุนของภาพลายน้ำ * @param ไอคอนเส้นทางลายน้ำ (เช่น: f:/images/icon.png) * @param แหล่งที่มาของภาพที่ไม่มีลายน้ำ AS: 11111) * @param imageType ประเภทภาพ (เช่น: jpg) * @param องศามุมการหมุนของภาพลายน้ำ, null หมายถึงไม่มีการหมุน */ สตริงคงที่ public String MarkimageBymoreicon (ไอคอนสตริง, สตริงแหล่งที่มา ลอง {file file = ไฟล์ใหม่ (แหล่งที่มา); ไฟล์ ficon = ไฟล์ใหม่ (ไอคอน); if (! file.isfile ()) {return Source + "ไม่ใช่ไฟล์รูปภาพ!"; } // โหลดไอคอนลงในหน่วยความจำ Image Im = imageio.read (ficon); // ไอคอนความสูง int iheight = ic.getheight (null); // อ่านภาพต้นฉบับลงในอิมเมจหน่วยความจำ img = imageio.read (ไฟล์); // ความกว้างของภาพความกว้าง int = img.getWidth (null); // ความสูงของภาพความสูง int = img.getheight (null); bufferedImage bi = bufferedImage ใหม่ (ความกว้าง, ความสูง, bufferedImage.type_int_rgb); // สร้างวัตถุกราฟิก 2D ด้วย bufferedImage graphics2d g = bi.createGraphics (); // x ค่าเริ่มต้น y-axis เริ่มจาก 0 พิกัด int x = 0; int y = 0; // ความสูงช่วงเวลาของภาพลายน้ำทั้งสองคือ 1/3 ของภาพลายน้ำ int temp = iheight/3; พื้นที่ int = 1; if (ความสูง> = iheight) {space = height/iheight; if (space> = 2) {temp = y = iheight/2; if (space == 1 || space == 0) {x = 0; y = 0; }}} else {x = 0; y = 0; } // ตั้งค่าการประมวลผลขอบ jagged ของส่วนบรรทัด 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 ++) {ถ้า (null! = องศา) {// ตั้งค่าการหมุนลายน้ำ G.rotate (Math.toradians (องศา), (สองเท่า) bi.getWidth () / 2, (สอง) bi.getheight () / 2); } // เส้นทางของภาพลายน้ำโดยทั่วไปคือ GIF หรือ PNG เพื่อให้ความโปร่งใสสามารถตั้งค่า imageIcon imgicon = imageicon ใหม่ (ไอคอน); // รับวัตถุภาพ Image con = imgicon.getImage (); // ความโปร่งใสค่าต่ำสุดคือ 0, ค่าสูงสุดคือ 1 Float Clarity = 0.6F; G.SetComposite (alphacomposite.getInstance (alphacomposite.src_atop, ความชัดเจน)); // ระบุตำแหน่งพิกัดของภาพลายน้ำ (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); // บันทึกภาพผลลัพธ์ = "ลายน้ำไอคอนจะถูกเพิ่มหลังจากภาพเสร็จสิ้น"; } catch (exception e) {e.printstacktrace (); } ผลตอบแทนผลลัพธ์; }/** * เพิ่มลายน้ำภาพเดียวลงในภาพและตั้งค่ามุมการหมุนภาพลายน้ำ * @param ไอคอนเส้นทางภาพลายน้ำ (เช่น: f:/image/icon.png) * @param ต้นทางเส้นทางภาพโดยไม่มีลายน้ำ (เช่น: f:/images/6.jpg) * @param 11111) * @param imageType ประเภทภาพ (เช่น: jpg) * @param องศามุมการหมุนของภาพลายน้ำ, null หมายถึงไม่มีการหมุน */ public String String markimageBysingleicon (ไอคอนสตริง, สตริง, output สตริง, imagename สตริง, imagetype สตริง ลอง {file file = ไฟล์ใหม่ (แหล่งที่มา); ไฟล์ ficon = ไฟล์ใหม่ (ไอคอน); if (! file.isfile ()) {return Source + "ไม่ใช่ไฟล์รูปภาพ!"; } // โหลดไอคอนลงในหน่วยความจำ Image Im = imageio.read (ficon); // ไอคอนความสูง int iheight = ic.getheight (null); // อ่านภาพต้นฉบับลงในอิมเมจหน่วยความจำ img = imageio.read (ไฟล์); // ความกว้างของภาพความกว้าง int = img.getWidth (null); // ความสูงของภาพความสูง int = img.getheight (null); bufferedImage bi = bufferedImage ใหม่ (ความกว้าง, ความสูง, bufferedImage.type_int_rgb); // สร้างวัตถุกราฟิก 2D ด้วย bufferedImage ที่ระบุ graphics2d g = bi.createGraphics (); // x ค่าเริ่มต้น y-axis เริ่มจาก 0 พิกัด int x = 0; int y = (ความสูง/2)-(iheight/2); // ตั้งค่าการประมวลผลขอบ jagged ของส่วนบรรทัด 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 ดังนั้นความโปร่งใสสามารถตั้งค่า imageicon imgicon = imageicon ใหม่ (ไอคอน); // รับภาพอิมเมจ Image con = imgicon.getImage (); // ความโปร่งใสค่าต่ำสุดคือ 0, ค่าสูงสุดคือ 1 Float Clarity = 0.6F; G.SetComposite (alphacomposite.getInstance (alphacomposite.src_atop, ความชัดเจน)); // ระบุตำแหน่งพิกัดของภาพลายน้ำ (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); // บันทึกภาพผลลัพธ์ = "ลายน้ำไอคอนจะถูกเพิ่มหลังจากภาพเสร็จสิ้น"; } catch (exception e) {e.printstacktrace (); } ผลตอบแทนผลลัพธ์; }/** * เพิ่มลายน้ำข้อความหลายข้อความลงในภาพและตั้งค่ามุมการหมุนข้อความลายน้ำ * @param แหล่งที่มาเส้นทางภาพที่ต้องเพิ่ม (เช่น: f:/images/6.jpg) * @param เอาต์พุตภาพออกภาพหลังจากเพิ่มชื่อ: @param) @param สีสีของข้อความลายน้ำ* @param คำลายน้ำข้อความ* @param องศามุมการหมุนของข้อความลายน้ำซึ่งหมายความว่าไม่มีการหมุน*/ สตริงคงที่ public String MarkimageByMoretext (แหล่งที่มาของสตริง, สตริง, imageName, imagetype สี, สี ลอง {// อ่านไฟล์ข้อมูลภาพต้นฉบับไฟล์ไฟล์ = ไฟล์ใหม่ (แหล่งที่มา); if (! file.isfile ()) {return file + "ไม่ใช่ไฟล์รูปภาพ!"; } image img = imageio.read (ไฟล์); // ความกว้างของภาพความกว้าง int = img.getWidth (null); // ความสูงของภาพความสูง int = img.getheight (null); // ขนาดข้อความขนาด int = 50; // เพิ่มลายน้ำ bufferedImage bi = bufferedImage ใหม่ (ความกว้าง, ความสูง, bufferedimage.type_int_rgb); graphics2d g = bi.createGraphics (); G.Drawimage (IMG, 0, 0, ความกว้าง, ความสูง, โมฆะ); // ตั้งค่าตัวอักษรสไตล์แบบอักษรลายน้ำ = ตัวอักษรใหม่ ("宋体", font.plain, ขนาด); // ตั้งค่าสีลายน้ำตามพื้นหลังของรูปภาพ G.SetColor (สี); int x = ความกว้าง/3; int y = ขนาด; พื้นที่ int = ความสูง/ขนาด; สำหรับ (int i = 0; i <space; i ++) {// ถ้าแกน y ของพิกัดสุดท้ายสูงกว่าความสูง, ออกโดยตรงถ้า ((y+size)> ความสูง) {break; } if (null! = องศา) {// ตั้งค่าการหมุนลายน้ำ G.rotate (Math.toradians (องศา), (สองครั้ง) Bi.getWidth () / 2, (สองเท่า) bi.getheight () / 2); } G.SetFont (แบบอักษร); // ตำแหน่งลายน้ำ G.DrawString (Word, X, Y); y+= (2*ขนาด); } G.Dispose (); // ไฟล์ภาพเอาต์พุต sf = ไฟล์ใหม่ (เอาต์พุต, imageName+"."+imageType); Imageio.write (bi, imagetype, sf); // บันทึกผลลัพธ์ภาพ = "เพิ่ม Word Watermark หลังจากเสร็จสิ้นภาพ"; } catch (exception e) {e.printstacktrace (); } ผลตอบแทนผลลัพธ์; }/** * เพิ่มลายน้ำข้อความเดียวลงในภาพและตั้งค่ามุมการหมุนข้อความลายน้ำ * @param แหล่งที่มาเส้นทางภาพที่ต้องเพิ่มด้วยลายน้ำ (เช่น: f:/images/6.jpg) * @param เอาท์พุทภาพออก jpg)* @param สีสีของข้อความลายน้ำ* @param word ข้อความลายน้ำ* @param องศามุมการหมุนของข้อความลายน้ำซึ่งหมายความว่าไม่มีการหมุน*/ public String String MarkimageBysingLetext (แหล่งที่มาของสตริง ลอง {// อ่านไฟล์ข้อมูลภาพต้นฉบับไฟล์ไฟล์ = ไฟล์ใหม่ (แหล่งที่มา); if (! file.isfile ()) {return file + "ไม่ใช่ไฟล์รูปภาพ!"; } image img = imageio.read (ไฟล์); int width = img.getWidth (null); ความสูง int = img.getheight (null); // เพิ่มลายน้ำ bufferedImage bi = bufferedImage ใหม่ (ความกว้าง, ความสูง, bufferedimage.type_int_rgb); graphics2d g = bi.createGraphics (); G.Drawimage (IMG, 0, 0, ความกว้าง, ความสูง, โมฆะ); // ตั้งค่าตัวอักษรสไตล์แบบอักษรลายน้ำ = ตัวอักษรใหม่ ("宋体", font.plain, 50); // ตั้งค่าสีลายน้ำตามพื้นหลังของรูปภาพ G.SetColor (สี); if (null! = องศา) {// ตั้งค่าการหมุนลายน้ำ G.rotate (Math.toradians (องศา), (สองครั้ง) Bi.getWidth () / 2, (สองเท่า) bi.getheight () / 2); } G.SetFont (แบบอักษร); int x = ความกว้าง/3; int y = ความสูง/2; // ตำแหน่งลายน้ำ G.DrawString (Word, X, Y); G.Dispose (); // ไฟล์ภาพเอาต์พุต sf = ไฟล์ใหม่ (เอาต์พุต, imageName+"."+imageType); Imageio.write (bi, imagetype, sf); // บันทึกผลลัพธ์ภาพ = "เพิ่ม Word Watermark หลังจากเสร็จสิ้นภาพ"; } catch (exception e) {e.printstacktrace (); } ผลตอบแทนผลลัพธ์; }/** * เพิ่มโมเสคลงในภาพ * @param ต้นทางเส้นทางภาพต้นฉบับ (เช่น: f:/images/6.jpg) * @param output หลังจาก mosaicing เส้นทางที่จะบันทึกภาพ (เช่น: f:/images/) * @param imagename ชื่อภาพ (เช่น: 11111) * @param imagetype และความสูงของแต่ละสี่เหลี่ยมผืนผ้า * @return */ สตริงคงที่ public String MarkimageByMosaic (แหล่งที่มาของสตริง, เอาต์พุตสตริง, imageName สตริง, สตริง imageType, ขนาด int) {สตริงผลลัพธ์ = "ข้อผิดพลาดของภาพโมเสคเกิดขึ้น"; ลอง {file file = ไฟล์ใหม่ (แหล่งที่มา); if (! file.isfile ()) {return file + "ไม่ใช่ไฟล์รูปภาพ!"; } bufferedImage img = imageio.read (ไฟล์); // อ่านความกว้างของภาพ = img.getWidth (null); // ความกว้างของภาพต้นฉบับความสูง int = img.getheight (null); // ความสูงของภาพต้นฉบับ bufferedImage bi = bufferedImage ใหม่ (ความกว้าง, ความสูง, bufferedImage.type_int_rgb); // ขนาดกริดโมเสคมีขนาดใหญ่เกินไปหรือเล็กเกินไปถ้า (ความกว้าง <size || ความสูง <ขนาด) {return "ขนาดกริดโมเสคมีขนาดใหญ่เกินไป"; } ถ้า (ขนาด <= 0) {return "ขนาดของกริดโมเสคนั้นเล็กเกินไป"; } int xcount = 0; // วาดหมายเลขใน x ทิศทาง int ycount = 0; // วาดตัวเลขในทิศทาง y ถ้า (ความกว้าง % size == 0) {xcount = ความกว้าง /ขนาด; } else {xcount = width / size + 1; } if (ความสูง % size == 0) {ycount = ความสูง / ขนาด; } else {ycount = ความสูง / ขนาด + 1; } int x = 0; // x พิกัด int y = 0; // y พิกัด // วาดโมเสค (วาดรูปสี่เหลี่ยมและสีเติม) กราฟิก 2d g = bi.createGraphics (); สำหรับ (int i = 0; i <xcount; i ++) {สำหรับ (int j = 0; j <ycount; j ++) {// ขนาดสี่เหลี่ยมผืนผ้าโมเสคขนาด int mwidth = ขนาด; int mheight = size; if (i == xcount-1) {// อันสุดท้ายในทิศทางแนวนอนไม่เพียงพอสำหรับหนึ่งขนาด mwidth = width-x; } ถ้า (j == ycount-1) {// อันสุดท้ายในทิศทางแนวตั้งไม่เพียงพอสำหรับหนึ่งขนาด mheight = ความสูง y; } // ค่า RGB ของสีสี่เหลี่ยมผืนผ้าใช้พิกเซลกลาง int centerx = x; int centery = y; if (mWidth % 2 == 0) {centerx += mWidth / 2; } else {centerx += (mwidth - 1) / 2; } if (mheight % 2 == 0) {Centery += mheight / 2; } else {Centery += (mheight - 1) / 2; } color color = สีใหม่ (img.getRgb (centerx, centery)); G.SetColor (สี); G.FillRect (x, y, mwidth, mheight); y = y + size; // คำนวณพิกัด y ของสี่เหลี่ยมผืนผ้าถัดไป} y = 0; // คืนค่าพิกัด y x = x + ขนาด; // คำนวณพิกัด x} g.dispose (); ไฟล์ sf = ไฟล์ใหม่ (เอาต์พุต, imageName+"."+imageType); Imageio.write (bi, imagetype, sf); // บันทึกผลลัพธ์ภาพ = "ความสำเร็จของโมเสค"; } catch (exception e) {e.printstacktrace (); } ผลตอบแทนผลลัพธ์; -สำหรับเนื้อหาที่เกี่ยวข้องกับ Java เพิ่มเติมผู้อ่านที่สนใจในเว็บไซต์นี้สามารถดูหัวข้อ: "บทสรุปของทักษะการใช้งานภาพ Java", "สรุปของ Java Date และ Time Operation Skills", "บทสรุปของทักษะการดำเนินงาน Java Dom Node", "สรุปของไฟล์ Java และทักษะการดำเนินการไดเรกทอรี"
ฉันหวังว่าบทความนี้จะเป็นประโยชน์กับการเขียนโปรแกรม Java ของทุกคน