[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"blog-post-repeating-watermark-with-coldfusion-and-java":3},{"id":4,"title":5,"body":6,"date":1494,"description":12,"extension":1495,"meta":1496,"navigation":218,"path":1497,"published":218,"seo":1498,"slug":1499,"stem":1500,"summary":5,"tags":1501,"__hash__":1505},"blog/blog/2015-06-11-repeating-watermark-with-coldfusion-and-java.md","Repeating Watermark with ColdFusion & Java",{"type":7,"value":8,"toc":1492},"minimark",[9,13,16,21,908,911,914,1054,1057,1189,1192,1433,1436,1439,1442,1449,1452,1476,1485,1488],[10,11,12],"p",{},"Let's make some watermarks with Java. This one's been in the backlog of my mind for a good while now. It's really a one situation tool, but it was cool as hell to dig into and figure out how to do it.",[10,14,15],{},"I had to apply a watermark on a pretty large sum of images. ColdFusion makes this fairly easy. In the given scenario though, it wasn't just a watermark; but a repeating watermark on a 45 degree. Still fairly simple with CFML I'm sure (?), but I didn't go that route. I called on some Java classes instead. In the past, I've had questionable experiences with ColdFusion's image functions when doing heavy lifting on a large amount of images that might need to be resized and altered in more than one way. To be honest, I'm not sure how today's engine performs. I use Lucee these days and I couldn't speak for how it's functions stand up either. Something to compare in the future I suppose.",[17,18,20],"h4",{"id":19},"so-heres-a-component-that-spins-up-some-magic","So here's a component that spins up some magic...",[22,23,28],"pre",{"className":24,"code":25,"language":26,"meta":27,"style":27},"language-js shiki shiki-themes github-light github-dark github-dark monokai","component name=\"Watermark\"\n    output=\"false\"\n{\n    public any function init() {\n        variables.AlphaComposite = createObject(\"java\", \"java.awt.AlphaComposite\");\n        variables.Color = createObject(\"java\", \"java.awt.Color\");\n        variables.Font = createObject(\"java\", \"java.awt.Font\");\n        variables.jFile = createObject(\"java\", \"java.io.File\");\n        variables.AffineTransform = createObject(\"java\", \"java.awt.geom.AffineTransform\");\n        variables.ImageIO = createObject(\"java\", \"javax.imageio.ImageIO\");\n\n        return this;\n    }\n\n    public void function addTextWatermark(\n        required string text,\n        required string srcImgPath,\n        required string destImgPath\n    ) {\n        try {\n            // Read in the image\n            var srcImg = variables.ImageIO.read(variables.jFile.init(arguments.srcImgPath));\n            var g2d = srcImg.getGraphics();\n\n            // Create our font properties for the supplied text and rotate it 45 degress\n            var alphaChannel = variables.AlphaComposite.getInstance(variables.AlphaComposite.SRC_OVER, 0.3);\n            g2d.setComposite(alphaChannel);\n            g2d.setColor(variables.Color.WHITE);\n            var aft = variables.AffineTransform;\n            aft.rotate(45 * pi() / 180);\n            var font = variables.Font.init(\"Arial\", variables.Font.BOLD, 64);\n            g2d.setFont(font.deriveFont(aft));\n\n            // Get font dimensions\n            var fontMetrics = g2d.getFontMetrics();\n            var rect = fontMetrics.getStringBounds(arguments.text, g2d);\n\n            // Get the x and y factors\n            var xFactor = cos(45 * pi() / 180);\n            var yFactor = sin(45 * pi() / 180);\n\n            // Crunch through positions to place our watermark text\n            for (var x = 0; x \u003C srcImg.getWidth(); x += rect.getWidth() * xFactor + rect.getHeight() * yFactor) {\n                for (var y = -60 * yFactor; y \u003C srcImg.getHeight(); y += rect.getWidth() * yFactor + rect.getHeight() * xFactor) {\n                    g2d.drawString(arguments.text, x, y);\n                }\n            }\n\n            // Write file and clean up\n            variables.ImageIO.write(srcImg, \"png\", variables.jFile.init(arguments.destImgPath));\n            g2d.dispose();\n        }\n        catch(any e) {\n            throw(e.message);\n        }\n    }\n}\n","js","",[29,30,31,48,59,65,82,108,129,150,171,192,213,220,233,239,244,262,278,290,300,306,315,322,353,372,377,383,414,426,442,455,486,519,536,541,547,565,588,593,599,628,657,662,668,732,792,808,814,820,825,831,858,868,874,883,892,897,902],"code",{"__ignoreMap":27},[32,33,36,40,44],"span",{"class":34,"line":35},"line",1,[32,37,39],{"class":38},"s__4a","component name",[32,41,43],{"class":42},"sOw68","=",[32,45,47],{"class":46},"svw4x","\"Watermark\"\n",[32,49,51,54,56],{"class":34,"line":50},2,[32,52,53],{"class":38},"    output",[32,55,43],{"class":42},[32,57,58],{"class":46},"\"false\"\n",[32,60,62],{"class":34,"line":61},3,[32,63,64],{"class":38},"{\n",[32,66,68,71,75,79],{"class":34,"line":67},4,[32,69,70],{"class":38},"    public any ",[32,72,74],{"class":73},"seVH3","function",[32,76,78],{"class":77},"s9ihy"," init",[32,80,81],{"class":38},"() {\n",[32,83,85,88,90,93,96,99,102,105],{"class":34,"line":84},5,[32,86,87],{"class":38},"        variables.AlphaComposite ",[32,89,43],{"class":42},[32,91,92],{"class":77}," createObject",[32,94,95],{"class":38},"(",[32,97,98],{"class":46},"\"java\"",[32,100,101],{"class":38},", ",[32,103,104],{"class":46},"\"java.awt.AlphaComposite\"",[32,106,107],{"class":38},");\n",[32,109,111,114,116,118,120,122,124,127],{"class":34,"line":110},6,[32,112,113],{"class":38},"        variables.Color ",[32,115,43],{"class":42},[32,117,92],{"class":77},[32,119,95],{"class":38},[32,121,98],{"class":46},[32,123,101],{"class":38},[32,125,126],{"class":46},"\"java.awt.Color\"",[32,128,107],{"class":38},[32,130,132,135,137,139,141,143,145,148],{"class":34,"line":131},7,[32,133,134],{"class":38},"        variables.Font ",[32,136,43],{"class":42},[32,138,92],{"class":77},[32,140,95],{"class":38},[32,142,98],{"class":46},[32,144,101],{"class":38},[32,146,147],{"class":46},"\"java.awt.Font\"",[32,149,107],{"class":38},[32,151,153,156,158,160,162,164,166,169],{"class":34,"line":152},8,[32,154,155],{"class":38},"        variables.jFile ",[32,157,43],{"class":42},[32,159,92],{"class":77},[32,161,95],{"class":38},[32,163,98],{"class":46},[32,165,101],{"class":38},[32,167,168],{"class":46},"\"java.io.File\"",[32,170,107],{"class":38},[32,172,174,177,179,181,183,185,187,190],{"class":34,"line":173},9,[32,175,176],{"class":38},"        variables.AffineTransform ",[32,178,43],{"class":42},[32,180,92],{"class":77},[32,182,95],{"class":38},[32,184,98],{"class":46},[32,186,101],{"class":38},[32,188,189],{"class":46},"\"java.awt.geom.AffineTransform\"",[32,191,107],{"class":38},[32,193,195,198,200,202,204,206,208,211],{"class":34,"line":194},10,[32,196,197],{"class":38},"        variables.ImageIO ",[32,199,43],{"class":42},[32,201,92],{"class":77},[32,203,95],{"class":38},[32,205,98],{"class":46},[32,207,101],{"class":38},[32,209,210],{"class":46},"\"javax.imageio.ImageIO\"",[32,212,107],{"class":38},[32,214,216],{"class":34,"line":215},11,[32,217,219],{"emptyLinePlaceholder":218},true,"\n",[32,221,223,226,230],{"class":34,"line":222},12,[32,224,225],{"class":42},"        return",[32,227,229],{"class":228},"s0XdW"," this",[32,231,232],{"class":38},";\n",[32,234,236],{"class":34,"line":235},13,[32,237,238],{"class":38},"    }\n",[32,240,242],{"class":34,"line":241},14,[32,243,219],{"emptyLinePlaceholder":218},[32,245,247,250,253,256,259],{"class":34,"line":246},15,[32,248,249],{"class":38},"    public ",[32,251,252],{"class":42},"void",[32,254,255],{"class":73}," function",[32,257,258],{"class":77}," addTextWatermark",[32,260,261],{"class":38},"(\n",[32,263,265,269,272,275],{"class":34,"line":264},16,[32,266,268],{"class":267},"sYQ0Z","        required",[32,270,271],{"class":267}," string",[32,273,274],{"class":267}," text",[32,276,277],{"class":38},",\n",[32,279,281,283,285,288],{"class":34,"line":280},17,[32,282,268],{"class":267},[32,284,271],{"class":267},[32,286,287],{"class":267}," srcImgPath",[32,289,277],{"class":38},[32,291,293,295,297],{"class":34,"line":292},18,[32,294,268],{"class":267},[32,296,271],{"class":267},[32,298,299],{"class":267}," destImgPath\n",[32,301,303],{"class":34,"line":302},19,[32,304,305],{"class":38},"    ) {\n",[32,307,309,312],{"class":34,"line":308},20,[32,310,311],{"class":42},"        try",[32,313,314],{"class":38}," {\n",[32,316,318],{"class":34,"line":317},21,[32,319,321],{"class":320},"sq-8i","            // Read in the image\n",[32,323,325,328,331,333,336,339,342,345,347,350],{"class":34,"line":324},22,[32,326,327],{"class":73},"            var",[32,329,330],{"class":38}," srcImg ",[32,332,43],{"class":42},[32,334,335],{"class":38}," variables.ImageIO.",[32,337,338],{"class":77},"read",[32,340,341],{"class":38},"(variables.jFile.",[32,343,344],{"class":77},"init",[32,346,95],{"class":38},[32,348,349],{"class":228},"arguments",[32,351,352],{"class":38},".srcImgPath));\n",[32,354,356,358,361,363,366,369],{"class":34,"line":355},23,[32,357,327],{"class":73},[32,359,360],{"class":38}," g2d ",[32,362,43],{"class":42},[32,364,365],{"class":38}," srcImg.",[32,367,368],{"class":77},"getGraphics",[32,370,371],{"class":38},"();\n",[32,373,375],{"class":34,"line":374},24,[32,376,219],{"emptyLinePlaceholder":218},[32,378,380],{"class":34,"line":379},25,[32,381,382],{"class":320},"            // Create our font properties for the supplied text and rotate it 45 degress\n",[32,384,386,388,391,393,396,399,402,406,408,412],{"class":34,"line":385},26,[32,387,327],{"class":73},[32,389,390],{"class":38}," alphaChannel ",[32,392,43],{"class":42},[32,394,395],{"class":38}," variables.AlphaComposite.",[32,397,398],{"class":77},"getInstance",[32,400,401],{"class":38},"(variables.AlphaComposite.",[32,403,405],{"class":404},"sdLxW","SRC_OVER",[32,407,101],{"class":38},[32,409,411],{"class":410},"s-7EV","0.3",[32,413,107],{"class":38},[32,415,417,420,423],{"class":34,"line":416},27,[32,418,419],{"class":38},"            g2d.",[32,421,422],{"class":77},"setComposite",[32,424,425],{"class":38},"(alphaChannel);\n",[32,427,429,431,434,437,440],{"class":34,"line":428},28,[32,430,419],{"class":38},[32,432,433],{"class":77},"setColor",[32,435,436],{"class":38},"(variables.Color.",[32,438,439],{"class":404},"WHITE",[32,441,107],{"class":38},[32,443,445,447,450,452],{"class":34,"line":444},29,[32,446,327],{"class":73},[32,448,449],{"class":38}," aft ",[32,451,43],{"class":42},[32,453,454],{"class":38}," variables.AffineTransform;\n",[32,456,458,461,464,466,469,472,475,478,481,484],{"class":34,"line":457},30,[32,459,460],{"class":38},"            aft.",[32,462,463],{"class":77},"rotate",[32,465,95],{"class":38},[32,467,468],{"class":410},"45",[32,470,471],{"class":42}," *",[32,473,474],{"class":77}," pi",[32,476,477],{"class":38},"() ",[32,479,480],{"class":42},"/",[32,482,483],{"class":410}," 180",[32,485,107],{"class":38},[32,487,489,491,494,496,499,501,503,506,509,512,514,517],{"class":34,"line":488},31,[32,490,327],{"class":73},[32,492,493],{"class":38}," font ",[32,495,43],{"class":42},[32,497,498],{"class":38}," variables.Font.",[32,500,344],{"class":77},[32,502,95],{"class":38},[32,504,505],{"class":46},"\"Arial\"",[32,507,508],{"class":38},", variables.Font.",[32,510,511],{"class":404},"BOLD",[32,513,101],{"class":38},[32,515,516],{"class":410},"64",[32,518,107],{"class":38},[32,520,522,524,527,530,533],{"class":34,"line":521},32,[32,523,419],{"class":38},[32,525,526],{"class":77},"setFont",[32,528,529],{"class":38},"(font.",[32,531,532],{"class":77},"deriveFont",[32,534,535],{"class":38},"(aft));\n",[32,537,539],{"class":34,"line":538},33,[32,540,219],{"emptyLinePlaceholder":218},[32,542,544],{"class":34,"line":543},34,[32,545,546],{"class":320},"            // Get font dimensions\n",[32,548,550,552,555,557,560,563],{"class":34,"line":549},35,[32,551,327],{"class":73},[32,553,554],{"class":38}," fontMetrics ",[32,556,43],{"class":42},[32,558,559],{"class":38}," g2d.",[32,561,562],{"class":77},"getFontMetrics",[32,564,371],{"class":38},[32,566,568,570,573,575,578,581,583,585],{"class":34,"line":567},36,[32,569,327],{"class":73},[32,571,572],{"class":38}," rect ",[32,574,43],{"class":42},[32,576,577],{"class":38}," fontMetrics.",[32,579,580],{"class":77},"getStringBounds",[32,582,95],{"class":38},[32,584,349],{"class":228},[32,586,587],{"class":38},".text, g2d);\n",[32,589,591],{"class":34,"line":590},37,[32,592,219],{"emptyLinePlaceholder":218},[32,594,596],{"class":34,"line":595},38,[32,597,598],{"class":320},"            // Get the x and y factors\n",[32,600,602,604,607,609,612,614,616,618,620,622,624,626],{"class":34,"line":601},39,[32,603,327],{"class":73},[32,605,606],{"class":38}," xFactor ",[32,608,43],{"class":42},[32,610,611],{"class":77}," cos",[32,613,95],{"class":38},[32,615,468],{"class":410},[32,617,471],{"class":42},[32,619,474],{"class":77},[32,621,477],{"class":38},[32,623,480],{"class":42},[32,625,483],{"class":410},[32,627,107],{"class":38},[32,629,631,633,636,638,641,643,645,647,649,651,653,655],{"class":34,"line":630},40,[32,632,327],{"class":73},[32,634,635],{"class":38}," yFactor ",[32,637,43],{"class":42},[32,639,640],{"class":77}," sin",[32,642,95],{"class":38},[32,644,468],{"class":410},[32,646,471],{"class":42},[32,648,474],{"class":77},[32,650,477],{"class":38},[32,652,480],{"class":42},[32,654,483],{"class":410},[32,656,107],{"class":38},[32,658,660],{"class":34,"line":659},41,[32,661,219],{"emptyLinePlaceholder":218},[32,663,665],{"class":34,"line":664},42,[32,666,667],{"class":320},"            // Crunch through positions to place our watermark text\n",[32,669,671,674,677,680,683,685,688,691,694,696,699,702,705,708,710,712,715,717,720,722,725,727,729],{"class":34,"line":670},43,[32,672,673],{"class":42},"            for",[32,675,676],{"class":38}," (",[32,678,679],{"class":73},"var",[32,681,682],{"class":38}," x ",[32,684,43],{"class":42},[32,686,687],{"class":410}," 0",[32,689,690],{"class":38},"; x ",[32,692,693],{"class":42},"\u003C",[32,695,365],{"class":38},[32,697,698],{"class":77},"getWidth",[32,700,701],{"class":38},"(); x ",[32,703,704],{"class":42},"+=",[32,706,707],{"class":38}," rect.",[32,709,698],{"class":77},[32,711,477],{"class":38},[32,713,714],{"class":42},"*",[32,716,606],{"class":38},[32,718,719],{"class":42},"+",[32,721,707],{"class":38},[32,723,724],{"class":77},"getHeight",[32,726,477],{"class":38},[32,728,714],{"class":42},[32,730,731],{"class":38}," yFactor) {\n",[32,733,735,738,740,742,745,747,750,753,755,758,760,762,764,767,769,771,773,775,777,779,781,783,785,787,789],{"class":34,"line":734},44,[32,736,737],{"class":42},"                for",[32,739,676],{"class":38},[32,741,679],{"class":73},[32,743,744],{"class":38}," y ",[32,746,43],{"class":42},[32,748,749],{"class":42}," -",[32,751,752],{"class":410},"60",[32,754,471],{"class":42},[32,756,757],{"class":38}," yFactor; y ",[32,759,693],{"class":42},[32,761,365],{"class":38},[32,763,724],{"class":77},[32,765,766],{"class":38},"(); y ",[32,768,704],{"class":42},[32,770,707],{"class":38},[32,772,698],{"class":77},[32,774,477],{"class":38},[32,776,714],{"class":42},[32,778,635],{"class":38},[32,780,719],{"class":42},[32,782,707],{"class":38},[32,784,724],{"class":77},[32,786,477],{"class":38},[32,788,714],{"class":42},[32,790,791],{"class":38}," xFactor) {\n",[32,793,795,798,801,803,805],{"class":34,"line":794},45,[32,796,797],{"class":38},"                    g2d.",[32,799,800],{"class":77},"drawString",[32,802,95],{"class":38},[32,804,349],{"class":228},[32,806,807],{"class":38},".text, x, y);\n",[32,809,811],{"class":34,"line":810},46,[32,812,813],{"class":38},"                }\n",[32,815,817],{"class":34,"line":816},47,[32,818,819],{"class":38},"            }\n",[32,821,823],{"class":34,"line":822},48,[32,824,219],{"emptyLinePlaceholder":218},[32,826,828],{"class":34,"line":827},49,[32,829,830],{"class":320},"            // Write file and clean up\n",[32,832,834,837,840,843,846,849,851,853,855],{"class":34,"line":833},50,[32,835,836],{"class":38},"            variables.ImageIO.",[32,838,839],{"class":77},"write",[32,841,842],{"class":38},"(srcImg, ",[32,844,845],{"class":46},"\"png\"",[32,847,848],{"class":38},", variables.jFile.",[32,850,344],{"class":77},[32,852,95],{"class":38},[32,854,349],{"class":228},[32,856,857],{"class":38},".destImgPath));\n",[32,859,861,863,866],{"class":34,"line":860},51,[32,862,419],{"class":38},[32,864,865],{"class":77},"dispose",[32,867,371],{"class":38},[32,869,871],{"class":34,"line":870},52,[32,872,873],{"class":38},"        }\n",[32,875,877,880],{"class":34,"line":876},53,[32,878,879],{"class":42},"        catch",[32,881,882],{"class":38},"(any e) {\n",[32,884,886,889],{"class":34,"line":885},54,[32,887,888],{"class":42},"            throw",[32,890,891],{"class":38},"(e.message);\n",[32,893,895],{"class":34,"line":894},55,[32,896,873],{"class":38},[32,898,900],{"class":34,"line":899},56,[32,901,238],{"class":38},[32,903,905],{"class":34,"line":904},57,[32,906,907],{"class":38},"}\n",[10,909,910],{},"In a nutshell, it takes a absolute path to a given image, the text to be layered over said image and a destination path (and name) for the result image, processes and creates a newly watermarked image.",[10,912,913],{},"So let's break this bad boy down.",[22,915,919],{"className":916,"code":917,"language":918,"meta":27,"style":27},"language-java shiki shiki-themes github-light github-dark github-dark monokai","\u003Ccfscript>\n    variables.AlphaComposite = createObject(\"java\", \"java.awt.AlphaComposite\");\n    variables.Color = createObject(\"java\", \"java.awt.Color\");\n    variables.Font = createObject(\"java\", \"java.awt.Font\");\n    variables.jFile = createObject(\"java\", \"java.io.File\");\n    variables.AffineTransform = createObject(\"java\", \"java.awt.geom.AffineTransform\");\n    variables.ImageIO = createObject(\"java\", \"javax.imageio.ImageIO\");\n\u003C/cfscript>\n","java",[29,920,921,931,950,969,988,1007,1026,1045],{"__ignoreMap":27},[32,922,923,925,928],{"class":34,"line":35},[32,924,693],{"class":42},[32,926,927],{"class":38},"cfscript",[32,929,930],{"class":42},">\n",[32,932,933,936,938,940,942,944,946,948],{"class":34,"line":50},[32,934,935],{"class":38},"    variables.AlphaComposite ",[32,937,43],{"class":42},[32,939,92],{"class":77},[32,941,95],{"class":38},[32,943,98],{"class":46},[32,945,101],{"class":38},[32,947,104],{"class":46},[32,949,107],{"class":38},[32,951,952,955,957,959,961,963,965,967],{"class":34,"line":61},[32,953,954],{"class":38},"    variables.Color ",[32,956,43],{"class":42},[32,958,92],{"class":77},[32,960,95],{"class":38},[32,962,98],{"class":46},[32,964,101],{"class":38},[32,966,126],{"class":46},[32,968,107],{"class":38},[32,970,971,974,976,978,980,982,984,986],{"class":34,"line":67},[32,972,973],{"class":38},"    variables.Font ",[32,975,43],{"class":42},[32,977,92],{"class":77},[32,979,95],{"class":38},[32,981,98],{"class":46},[32,983,101],{"class":38},[32,985,147],{"class":46},[32,987,107],{"class":38},[32,989,990,993,995,997,999,1001,1003,1005],{"class":34,"line":84},[32,991,992],{"class":38},"    variables.jFile ",[32,994,43],{"class":42},[32,996,92],{"class":77},[32,998,95],{"class":38},[32,1000,98],{"class":46},[32,1002,101],{"class":38},[32,1004,168],{"class":46},[32,1006,107],{"class":38},[32,1008,1009,1012,1014,1016,1018,1020,1022,1024],{"class":34,"line":110},[32,1010,1011],{"class":38},"    variables.AffineTransform ",[32,1013,43],{"class":42},[32,1015,92],{"class":77},[32,1017,95],{"class":38},[32,1019,98],{"class":46},[32,1021,101],{"class":38},[32,1023,189],{"class":46},[32,1025,107],{"class":38},[32,1027,1028,1031,1033,1035,1037,1039,1041,1043],{"class":34,"line":131},[32,1029,1030],{"class":38},"    variables.ImageIO ",[32,1032,43],{"class":42},[32,1034,92],{"class":77},[32,1036,95],{"class":38},[32,1038,98],{"class":46},[32,1040,101],{"class":38},[32,1042,210],{"class":46},[32,1044,107],{"class":38},[32,1046,1047,1050,1052],{"class":34,"line":152},[32,1048,1049],{"class":42},"\u003C/",[32,1051,927],{"class":38},[32,1053,930],{"class":42},[10,1055,1056],{},"For separation, I put all of my Java class calls in the init() function to be passed through the variables scope. File and ImageIO are used to create the Graphics2D class object that will be used to create and apply the watermark to. AlphaComposite, Color and Font are used with the result object from ImageIO to actually make the watermark. AffineTransform will help get the 45 degree turn to the watermark text.",[22,1058,1060],{"className":916,"code":1059,"language":918,"meta":27,"style":27},"\u003Ccfscript>\n    // Create our font properties for the supplied text and rotate it 45 degress\n    var alphaChannel = variables.AlphaComposite.getInstance(variables.AlphaComposite.SRC_OVER, 0.3);\n    g2d.setComposite(alphaChannel);\n    g2d.setColor(variables.Color.WHITE);\n    var aft = variables.AffineTransform;\n    aft.rotate(45 * pi() / 180);\n    var font = variables.Font.init(\"Arial\", variables.Font.BOLD, 64);\n    g2d.setFont(font.deriveFont(aft));\n\u003C/cfscript>\n",[29,1061,1062,1070,1075,1095,1104,1113,1123,1146,1169,1181],{"__ignoreMap":27},[32,1063,1064,1066,1068],{"class":34,"line":35},[32,1065,693],{"class":42},[32,1067,927],{"class":38},[32,1069,930],{"class":42},[32,1071,1072],{"class":34,"line":50},[32,1073,1074],{"class":320},"    // Create our font properties for the supplied text and rotate it 45 degress\n",[32,1076,1077,1080,1082,1084,1086,1088,1091,1093],{"class":34,"line":61},[32,1078,1079],{"class":73},"    var",[32,1081,390],{"class":38},[32,1083,43],{"class":42},[32,1085,395],{"class":38},[32,1087,398],{"class":77},[32,1089,1090],{"class":38},"(variables.AlphaComposite.SRC_OVER, ",[32,1092,411],{"class":410},[32,1094,107],{"class":38},[32,1096,1097,1100,1102],{"class":34,"line":67},[32,1098,1099],{"class":38},"    g2d.",[32,1101,422],{"class":77},[32,1103,425],{"class":38},[32,1105,1106,1108,1110],{"class":34,"line":84},[32,1107,1099],{"class":38},[32,1109,433],{"class":77},[32,1111,1112],{"class":38},"(variables.Color.WHITE);\n",[32,1114,1115,1117,1119,1121],{"class":34,"line":110},[32,1116,1079],{"class":73},[32,1118,449],{"class":38},[32,1120,43],{"class":42},[32,1122,454],{"class":38},[32,1124,1125,1128,1130,1132,1134,1136,1138,1140,1142,1144],{"class":34,"line":131},[32,1126,1127],{"class":38},"    aft.",[32,1129,463],{"class":77},[32,1131,95],{"class":38},[32,1133,468],{"class":410},[32,1135,471],{"class":42},[32,1137,474],{"class":77},[32,1139,477],{"class":38},[32,1141,480],{"class":42},[32,1143,483],{"class":410},[32,1145,107],{"class":38},[32,1147,1148,1150,1152,1154,1156,1158,1160,1162,1165,1167],{"class":34,"line":152},[32,1149,1079],{"class":73},[32,1151,493],{"class":38},[32,1153,43],{"class":42},[32,1155,498],{"class":38},[32,1157,344],{"class":77},[32,1159,95],{"class":38},[32,1161,505],{"class":46},[32,1163,1164],{"class":38},", variables.Font.BOLD, ",[32,1166,516],{"class":410},[32,1168,107],{"class":38},[32,1170,1171,1173,1175,1177,1179],{"class":34,"line":173},[32,1172,1099],{"class":38},[32,1174,526],{"class":77},[32,1176,529],{"class":38},[32,1178,532],{"class":77},[32,1180,535],{"class":38},[32,1182,1183,1185,1187],{"class":34,"line":194},[32,1184,1049],{"class":42},[32,1186,927],{"class":38},[32,1188,930],{"class":42},[10,1190,1191],{},"Once I have the image object to work with, I create a alpha channel with a low opacity so it gets that faded appearance on the image. Set it as the composite and make the color white. With the AffineTransform object, pass in a radian value of the degrees I want to turn the text into the rotate() function. Finallym creating the font object and applying the rotation to the object.",[22,1193,1195],{"className":916,"code":1194,"language":918,"meta":27,"style":27},"\u003Ccfscript>\n    // Get font dimensions\n    var fontMetrics = g2d.getFontMetrics();\n    var rect = fontMetrics.getStringBounds(arguments.text, g2d);\n\n    // Get the x and y factors\n    var xFactor = cos(45 * pi() / 180);\n    var yFactor = sin(45 * pi() / 180);\n    // Crunch through positions to place our watermark text\n    for (var x = 0; x \u003C srcImg.getWidth(); x += rect.getWidth() * xFactor + rect.getHeight() * yFactor) {\n        for (var y = -60 * yFactor; y \u003C srcImg.getHeight(); y += rect.getWidth() * yFactor + rect.getHeight() * xFactor) {\n          g2d.drawString(arguments.text, x, y);\n        }\n    }\n\u003C/cfscript>\n",[29,1196,1197,1205,1210,1224,1239,1243,1248,1274,1300,1305,1354,1407,1417,1421,1425],{"__ignoreMap":27},[32,1198,1199,1201,1203],{"class":34,"line":35},[32,1200,693],{"class":42},[32,1202,927],{"class":38},[32,1204,930],{"class":42},[32,1206,1207],{"class":34,"line":50},[32,1208,1209],{"class":320},"    // Get font dimensions\n",[32,1211,1212,1214,1216,1218,1220,1222],{"class":34,"line":61},[32,1213,1079],{"class":73},[32,1215,554],{"class":38},[32,1217,43],{"class":42},[32,1219,559],{"class":38},[32,1221,562],{"class":77},[32,1223,371],{"class":38},[32,1225,1226,1228,1230,1232,1234,1236],{"class":34,"line":67},[32,1227,1079],{"class":73},[32,1229,572],{"class":38},[32,1231,43],{"class":42},[32,1233,577],{"class":38},[32,1235,580],{"class":77},[32,1237,1238],{"class":38},"(arguments.text, g2d);\n",[32,1240,1241],{"class":34,"line":84},[32,1242,219],{"emptyLinePlaceholder":218},[32,1244,1245],{"class":34,"line":110},[32,1246,1247],{"class":320},"    // Get the x and y factors\n",[32,1249,1250,1252,1254,1256,1258,1260,1262,1264,1266,1268,1270,1272],{"class":34,"line":131},[32,1251,1079],{"class":73},[32,1253,606],{"class":38},[32,1255,43],{"class":42},[32,1257,611],{"class":77},[32,1259,95],{"class":38},[32,1261,468],{"class":410},[32,1263,471],{"class":42},[32,1265,474],{"class":77},[32,1267,477],{"class":38},[32,1269,480],{"class":42},[32,1271,483],{"class":410},[32,1273,107],{"class":38},[32,1275,1276,1278,1280,1282,1284,1286,1288,1290,1292,1294,1296,1298],{"class":34,"line":152},[32,1277,1079],{"class":73},[32,1279,635],{"class":38},[32,1281,43],{"class":42},[32,1283,640],{"class":77},[32,1285,95],{"class":38},[32,1287,468],{"class":410},[32,1289,471],{"class":42},[32,1291,474],{"class":77},[32,1293,477],{"class":38},[32,1295,480],{"class":42},[32,1297,483],{"class":410},[32,1299,107],{"class":38},[32,1301,1302],{"class":34,"line":173},[32,1303,1304],{"class":320},"    // Crunch through positions to place our watermark text\n",[32,1306,1307,1310,1312,1314,1316,1318,1320,1322,1324,1326,1328,1330,1332,1334,1336,1338,1340,1342,1344,1346,1348,1350,1352],{"class":34,"line":194},[32,1308,1309],{"class":42},"    for",[32,1311,676],{"class":38},[32,1313,679],{"class":73},[32,1315,682],{"class":38},[32,1317,43],{"class":42},[32,1319,687],{"class":410},[32,1321,690],{"class":38},[32,1323,693],{"class":42},[32,1325,365],{"class":38},[32,1327,698],{"class":77},[32,1329,701],{"class":38},[32,1331,704],{"class":42},[32,1333,707],{"class":38},[32,1335,698],{"class":77},[32,1337,477],{"class":38},[32,1339,714],{"class":42},[32,1341,606],{"class":38},[32,1343,719],{"class":42},[32,1345,707],{"class":38},[32,1347,724],{"class":77},[32,1349,477],{"class":38},[32,1351,714],{"class":42},[32,1353,731],{"class":38},[32,1355,1356,1359,1361,1363,1365,1367,1369,1371,1373,1375,1377,1379,1381,1383,1385,1387,1389,1391,1393,1395,1397,1399,1401,1403,1405],{"class":34,"line":215},[32,1357,1358],{"class":42},"        for",[32,1360,676],{"class":38},[32,1362,679],{"class":73},[32,1364,744],{"class":38},[32,1366,43],{"class":42},[32,1368,749],{"class":42},[32,1370,752],{"class":410},[32,1372,471],{"class":42},[32,1374,757],{"class":38},[32,1376,693],{"class":42},[32,1378,365],{"class":38},[32,1380,724],{"class":77},[32,1382,766],{"class":38},[32,1384,704],{"class":42},[32,1386,707],{"class":38},[32,1388,698],{"class":77},[32,1390,477],{"class":38},[32,1392,714],{"class":42},[32,1394,635],{"class":38},[32,1396,719],{"class":42},[32,1398,707],{"class":38},[32,1400,724],{"class":77},[32,1402,477],{"class":38},[32,1404,714],{"class":42},[32,1406,791],{"class":38},[32,1408,1409,1412,1414],{"class":34,"line":222},[32,1410,1411],{"class":38},"          g2d.",[32,1413,800],{"class":77},[32,1415,1416],{"class":38},"(arguments.text, x, y);\n",[32,1418,1419],{"class":34,"line":235},[32,1420,873],{"class":38},[32,1422,1423],{"class":34,"line":241},[32,1424,238],{"class":38},[32,1426,1427,1429,1431],{"class":34,"line":246},[32,1428,1049],{"class":42},[32,1430,927],{"class":38},[32,1432,930],{"class":42},[10,1434,1435],{},"I get the dimensions of the text and set the X and Y factors from our angle, then loop over the various coordinates generated from those and the dimensions of the actual image; drawing the text on each pass. That loop was honestly the hardest part for me. I'm not a trig guy by any means. Thankfully there is Google.",[10,1437,1438],{},"The last bit writes the image to the supplied location and clears out our watermark object.",[10,1440,1441],{},"In the end you get something like this...",[1443,1444],"nuxt-img",{"alt":1445,"format":1446,"height":1447,"src":1448,"width":1447},"Watermark Example","webp","100%","./img/blog/mad.jpg",[10,1450,1451],{},"Cool stuff. Here's some references I used to put it all together.",[1453,1454,1455,1464,1470],"ul",{},[1456,1457,1458],"li",{},[1459,1460,1461],"a",{"href":1461,"rel":1462},"http://mrbool.com/how-to-create-watermarks-with-java/29773",[1463],"nofollow",[1456,1465,1466],{},[1459,1467,1468],{"href":1468,"rel":1469},"http://stackoverflow.com/a/22745959/985709",[1463],[1456,1471,1472],{},[1459,1473,1474],{"href":1474,"rel":1475},"http://stackoverflow.com/a/24102883/985709",[1463],[10,1477,1478,1479,1484],{},"Here's a ",[1459,1480,1483],{"href":1481,"rel":1482},"https://github.com/tonyjunkes/repeated-watermark-example",[1463],"link to my example project on GitHub",".",[10,1486,1487],{},"Happy coding.",[1489,1490,1491],"style",{},"html pre.shiki code .s__4a, html code.shiki .s__4a{--shiki-light:#24292E;--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .sOw68, html code.shiki .sOw68{--shiki-light:#D73A49;--shiki-default:#F97583;--shiki-dark:#F97583;--shiki-sepia:#F92672}html pre.shiki code .svw4x, html code.shiki .svw4x{--shiki-light:#032F62;--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74}html pre.shiki code .seVH3, html code.shiki .seVH3{--shiki-light:#D73A49;--shiki-light-font-style:inherit;--shiki-default:#F97583;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit;--shiki-sepia:#66D9EF;--shiki-sepia-font-style:italic}html pre.shiki code .s9ihy, html code.shiki .s9ihy{--shiki-light:#6F42C1;--shiki-default:#B392F0;--shiki-dark:#B392F0;--shiki-sepia:#A6E22E}html pre.shiki code .s0XdW, html code.shiki .s0XdW{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-sepia:#FD971F}html pre.shiki code .sYQ0Z, html code.shiki .sYQ0Z{--shiki-light:#E36209;--shiki-light-font-style:inherit;--shiki-default:#FFAB70;--shiki-default-font-style:inherit;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit;--shiki-sepia:#FD971F;--shiki-sepia-font-style:italic}html pre.shiki code .sq-8i, html code.shiki .sq-8i{--shiki-light:#6A737D;--shiki-default:#6A737D;--shiki-dark:#6A737D;--shiki-sepia:#88846F}html pre.shiki code .sdLxW, html code.shiki .sdLxW{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-sepia:#F8F8F2}html pre.shiki code .s-7EV, html code.shiki .s-7EV{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-sepia:#AE81FF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html.sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}",{"title":27,"searchDepth":50,"depth":50,"links":1493},[],"2015-06-11","md",{},"/blog/2015-06-11-repeating-watermark-with-coldfusion-and-java",{"title":5,"description":12},"repeating-watermark-with-coldfusion-and-java","blog/2015-06-11-repeating-watermark-with-coldfusion-and-java",[1502,1503,1504],"ColdFusion","CFML","Java","fidJSkrMIN2PPane9psG_SyBC0Ai7n0rG8pi7-EH7ik"]