在php中如何实现下面图片的效果?

http://img2.mukewang.com/642fd40b0001935003340260.jpg

要求:“上”和“爱情”都是通过程序自动输出的,程序能共自动判断画布上得空白部分并输出文字。

在python中,有pygame库直接获得一个画布的mask,然后提供collide函数来判断两个mask是否有交集。php是否有类似功能?

换个问题:
php中如何获得双色图片的mask


HUH函数
浏览 135回答 1
1回答

交互式爱情

package&nbsp;com.ctrip; import&nbsp;java.awt.AlphaComposite; import&nbsp;java.awt.Color; import&nbsp;java.awt.Font; import&nbsp;java.awt.Graphics2D; import&nbsp;java.awt.GraphicsConfiguration; import&nbsp;java.awt.Paint; import&nbsp;java.awt.Rectangle; import&nbsp;java.awt.RenderingHints; import&nbsp;java.awt.font.FontRenderContext; import&nbsp;java.awt.geom.Rectangle2D; import&nbsp;java.awt.image.BufferedImage; import&nbsp;java.io.BufferedReader; import&nbsp;java.io.File; import&nbsp;java.io.FileInputStream; import&nbsp;java.io.IOException; import&nbsp;java.io.InputStreamReader; import&nbsp;java.io.PrintStream; import&nbsp;java.util.ArrayList; import&nbsp;java.util.Collections; import&nbsp;java.util.Comparator; import&nbsp;java.util.HashMap; import&nbsp;java.util.List; import&nbsp;java.util.Map; import&nbsp;java.util.Map.Entry; import&nbsp;javax.imageio.ImageIO; public&nbsp;class&nbsp;WordsThumb { &nbsp;&nbsp;public&nbsp;static&nbsp;final&nbsp;int&nbsp;MIN_WIDTH&nbsp;=&nbsp;320; &nbsp;&nbsp;public&nbsp;static&nbsp;final&nbsp;int&nbsp;MIN_HEIGHT&nbsp;=&nbsp;240; &nbsp;&nbsp;public&nbsp;static&nbsp;final&nbsp;int&nbsp;MAX_WIDTH&nbsp;=&nbsp;2560; &nbsp;&nbsp;public&nbsp;static&nbsp;final&nbsp;int&nbsp;MAX_HEIGHT&nbsp;=&nbsp;1920; &nbsp;&nbsp;public&nbsp;static&nbsp;final&nbsp;int&nbsp;BLOCK&nbsp;=&nbsp;4; &nbsp;&nbsp;public&nbsp;static&nbsp;final&nbsp;String&nbsp;DEF_FONT&nbsp;=&nbsp;"微软雅黑"; &nbsp;&nbsp;public&nbsp;static&nbsp;final&nbsp;int&nbsp;MIN_FONT_SIZE&nbsp;=&nbsp;12; &nbsp;&nbsp;private&nbsp;static&nbsp;final&nbsp;int[]&nbsp;COLORS&nbsp;=&nbsp;{&nbsp;11682842,&nbsp;14439168,&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;13081114,&nbsp;10300417,&nbsp;14450176,&nbsp;13052357,&nbsp;11665801,&nbsp;1739698,&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;101319,&nbsp;84146,&nbsp;15580865,&nbsp;1722823,&nbsp;6664705,&nbsp;11257601,&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;7582257,&nbsp;11665680,&nbsp;14425600,&nbsp;10768192,&nbsp;14360836,&nbsp;15515347,&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;111266,&nbsp;49372,&nbsp;15436032,&nbsp;15436032&nbsp;}; &nbsp;&nbsp;public&nbsp;BufferedImage&nbsp;createWordsThumb(Map<String,&nbsp;Integer>&nbsp;words,&nbsp;int&nbsp;width,&nbsp;int&nbsp;height,&nbsp;String&nbsp;fontName,&nbsp;Integer&nbsp;maxFontSize,&nbsp;Integer&nbsp;minFontSize) &nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((words&nbsp;==&nbsp;null)&nbsp;||&nbsp;(words.size()&nbsp;<&nbsp;1)&nbsp;||&nbsp;(width&nbsp;<&nbsp;320)&nbsp;||&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(width&nbsp;>&nbsp;2560)&nbsp;||&nbsp;(height&nbsp;<&nbsp;240)&nbsp;||&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(height&nbsp;>&nbsp;1920)) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;null; &nbsp;&nbsp;&nbsp;&nbsp;fontName&nbsp;=&nbsp;validateFontName(fontName,&nbsp;"微软雅黑"); &nbsp;&nbsp;&nbsp;&nbsp;List&nbsp;sortedWords&nbsp;=&nbsp;sortWordsMap(words); &nbsp;&nbsp;&nbsp;&nbsp;BufferedImage&nbsp;bi&nbsp;=&nbsp;createBufferedImage(width,&nbsp;height); &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(bi&nbsp;==&nbsp;null)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;null; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(maxFontSize&nbsp;==&nbsp;null)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;maxFontSize&nbsp;=&nbsp;Integer.valueOf(Math.min(width,&nbsp;height)&nbsp;/&nbsp;5); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(minFontSize&nbsp;==&nbsp;null)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;minFontSize&nbsp;=&nbsp;Integer.valueOf(Math.min(width,&nbsp;height)&nbsp;/&nbsp;40); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(minFontSize.intValue()&nbsp;<&nbsp;12) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;minFontSize&nbsp;=&nbsp;Integer.valueOf(12); &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(maxFontSize.intValue()&nbsp;<&nbsp;minFontSize.intValue())&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;maxFontSize&nbsp;=&nbsp;minFontSize; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(paintWords(bi,&nbsp;sortedWords,&nbsp;fontName,&nbsp;maxFontSize.intValue(),&nbsp;minFontSize.intValue())&nbsp;<&nbsp;1)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;null; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;bi; &nbsp;&nbsp;} &nbsp;&nbsp;private&nbsp;String&nbsp;validateFontName(String&nbsp;fontName,&nbsp;String&nbsp;defFont)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(fontName&nbsp;!=&nbsp;null)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Font&nbsp;font&nbsp;=&nbsp;new&nbsp;Font(fontName,&nbsp;0,&nbsp;16); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(font.getName().equals(fontName)) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;fontName; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;defFont; &nbsp;&nbsp;} &nbsp;&nbsp;private&nbsp;List<Map.Entry<String,&nbsp;Integer>>&nbsp;sortWordsMap(Map<String,&nbsp;Integer>&nbsp;words)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(words&nbsp;==&nbsp;null) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;null; &nbsp;&nbsp;&nbsp;&nbsp;ArrayList&nbsp;wordsList&nbsp;=&nbsp;new&nbsp;ArrayList( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;words.entrySet()); &nbsp;&nbsp;&nbsp;&nbsp;Collections.sort(wordsList,&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;Comparator() &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;int&nbsp;compare(Map.Entry<String,&nbsp;Integer>&nbsp;o1,&nbsp;Map.Entry<String,&nbsp;Integer>&nbsp;o2) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;o2&nbsp;==&nbsp;null&nbsp;?&nbsp;-1&nbsp;:&nbsp;o1&nbsp;==&nbsp;null&nbsp;?&nbsp;1&nbsp;:&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((Integer)o2 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.getValue()).intValue()&nbsp;-&nbsp;((Integer)o1.getValue()).intValue(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;}); &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;wordsList; &nbsp;&nbsp;} &nbsp;&nbsp;private&nbsp;BufferedImage&nbsp;createBufferedImage(int&nbsp;width,&nbsp;int&nbsp;height)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;BufferedImage&nbsp;bi&nbsp;=&nbsp;new&nbsp;BufferedImage(width,&nbsp;height,&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2); &nbsp;&nbsp;&nbsp;&nbsp;Graphics2D&nbsp;g2&nbsp;=&nbsp;bi.createGraphics(); &nbsp;&nbsp;&nbsp;&nbsp;bi&nbsp;=&nbsp;g2.getDeviceConfiguration().createCompatibleImage(width,&nbsp;height,&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3); &nbsp;&nbsp;&nbsp;&nbsp;g2.dispose(); &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;bi; &nbsp;&nbsp;} &nbsp;&nbsp;private&nbsp;int&nbsp;paintWords(BufferedImage&nbsp;bi,&nbsp;List<Map.Entry<String,&nbsp;Integer>>&nbsp;words,&nbsp;String&nbsp;fontName,&nbsp;int&nbsp;maxFontSize,&nbsp;int&nbsp;minFontSize) &nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;BitMap&nbsp;bitMap&nbsp;=&nbsp;initBitMap(bi); &nbsp;&nbsp;&nbsp;&nbsp;Graphics2D&nbsp;g2&nbsp;=&nbsp;bi.createGraphics(); &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;wordCount&nbsp;=&nbsp;0; &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;fontSizeAdjust&nbsp;=&nbsp;0; &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;maxFrequency&nbsp;=&nbsp;((Integer)((Map.Entry)words.get(0)).getValue()).intValue(); &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;minFrequency&nbsp;=&nbsp;((Integer)((Map.Entry)words.get(words.size()&nbsp;-&nbsp;1)).getValue()).intValue(); &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(Map.Entry&nbsp;entry&nbsp;:&nbsp;words) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(true) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Font&nbsp;font&nbsp;=&nbsp;initFont(g2,&nbsp;fontName,&nbsp;Integer.valueOf(maxFontSize),&nbsp;Integer.valueOf(minFontSize),&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(Integer)entry.getValue(),&nbsp;Integer.valueOf(maxFrequency),&nbsp;Integer.valueOf(minFrequency),&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Integer.valueOf(fontSizeAdjust)); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(font.getSize()&nbsp;<&nbsp;minFontSize) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;wordCount; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Rectangle2D&nbsp;bounds&nbsp;=&nbsp;getStringBounds(g2,&nbsp;font,&nbsp;(String)entry.getKey()); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;direction&nbsp;=&nbsp;(int)(Math.random()&nbsp;*&nbsp;10000.0D&nbsp;%&nbsp;4.0D&nbsp;%&nbsp;3.0D); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Rectangle2D&nbsp;rect&nbsp;=&nbsp;bounds.getBounds(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(direction&nbsp;!=&nbsp;0)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rect.setRect(rect.getX(),&nbsp;rect.getY(),&nbsp;rect.getHeight(),&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rect.getWidth()); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rect&nbsp;=&nbsp;findSpace(bitMap,&nbsp;rect); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(rect&nbsp;==&nbsp;null)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rect&nbsp;=&nbsp;bounds.getBounds(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(direction&nbsp;==&nbsp;0)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;direction&nbsp;=&nbsp;(int)(Math.random()&nbsp;*&nbsp;10000.0D&nbsp;%&nbsp;2.0D&nbsp;+&nbsp;1.0D); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rect.setRect(rect.getX(),&nbsp;rect.getY(),&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rect.getHeight(),&nbsp;rect.getWidth()); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;direction&nbsp;=&nbsp;0; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rect&nbsp;=&nbsp;findSpace(bitMap,&nbsp;rect); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(rect&nbsp;!=&nbsp;null)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;paintOneWord(bi,&nbsp;g2,&nbsp;(String)entry.getKey(),&nbsp;direction,&nbsp;rect,&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bounds); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;updateBitMap(bitMap,&nbsp;bi,&nbsp;rect); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wordCount++; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fontSizeAdjust--; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;wordCount; &nbsp;&nbsp;} &nbsp;&nbsp;private&nbsp;BitMap&nbsp;initBitMap(BufferedImage&nbsp;bi)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;w&nbsp;=&nbsp;(int)Math.ceil(bi.getWidth()&nbsp;/&nbsp;4.0D); &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;h&nbsp;=&nbsp;(int)Math.ceil(bi.getHeight()&nbsp;/&nbsp;4.0D); &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;new&nbsp;BitMap(w,&nbsp;h); &nbsp;&nbsp;} &nbsp;&nbsp;private&nbsp;Font&nbsp;initFont(Graphics2D&nbsp;g2,&nbsp;String&nbsp;fontName,&nbsp;Integer&nbsp;maxFontSize,&nbsp;Integer&nbsp;minFontSize,&nbsp;Integer&nbsp;frequency,&nbsp;Integer&nbsp;maxFrequency,&nbsp;Integer&nbsp;minFrequency,&nbsp;Integer&nbsp;fontSizeAdjust) &nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;fs&nbsp;=&nbsp;24; &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(maxFrequency.intValue()&nbsp;>&nbsp;minFrequency.intValue())&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fs&nbsp;=&nbsp;(int)((frequency.intValue()&nbsp;-&nbsp;minFrequency.intValue())&nbsp;*&nbsp;( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;maxFontSize.intValue()&nbsp;-&nbsp;minFontSize.intValue())&nbsp;/&nbsp;( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;maxFrequency.intValue()&nbsp;-&nbsp;minFrequency.intValue())&nbsp;+&nbsp;minFontSize.intValue()); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(fontSizeAdjust&nbsp;!=&nbsp;null)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fs&nbsp;+=&nbsp;fontSizeAdjust.intValue(); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;Font&nbsp;font&nbsp;=&nbsp;new&nbsp;Font(fontName,&nbsp;1,&nbsp;fs); &nbsp;&nbsp;&nbsp;&nbsp;g2.setFont(font); &nbsp;&nbsp;&nbsp;&nbsp;g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RenderingHints.VALUE_TEXT_ANTIALIAS_ON); &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;font; &nbsp;&nbsp;} &nbsp;&nbsp;private&nbsp;Rectangle2D&nbsp;getStringBounds(Graphics2D&nbsp;g2,&nbsp;Font&nbsp;font,&nbsp;String&nbsp;key) &nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;FontRenderContext&nbsp;frc&nbsp;=&nbsp;g2.getFontRenderContext(); &nbsp;&nbsp;&nbsp;&nbsp;Rectangle2D&nbsp;rc&nbsp;=&nbsp;font.getStringBounds(key,&nbsp;frc); &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;rc; &nbsp;&nbsp;} &nbsp;&nbsp;private&nbsp;Rectangle2D&nbsp;findSpace(BitMap&nbsp;bitMap,&nbsp;Rectangle2D&nbsp;rect)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;w&nbsp;=&nbsp;pixel2bitMap((int)rect.getWidth()); &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;h&nbsp;=&nbsp;pixel2bitMap((int)rect.getHeight()); &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;boundW&nbsp;=&nbsp;bitMap.getWidth()&nbsp;-&nbsp;w; &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;boundH&nbsp;=&nbsp;bitMap.getHeight()&nbsp;-&nbsp;h; &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;start_x&nbsp;=&nbsp;boundW&nbsp;/&nbsp;2; &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;start_y&nbsp;=&nbsp;boundH&nbsp;/&nbsp;2; &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;maxBound&nbsp;=&nbsp;Math.max(boundW,&nbsp;boundH); &nbsp;&nbsp;&nbsp;&nbsp;double&nbsp;wRatio&nbsp;=&nbsp;boundW&nbsp;/&nbsp;maxBound; &nbsp;&nbsp;&nbsp;&nbsp;double&nbsp;hRatio&nbsp;=&nbsp;boundH&nbsp;/&nbsp;maxBound; &nbsp;&nbsp;&nbsp;&nbsp;double&nbsp;max_r&nbsp;=&nbsp;Math.sin(0.7853981633974483D)&nbsp;*&nbsp;maxBound; &nbsp;&nbsp;&nbsp;&nbsp;double&nbsp;r&nbsp;=&nbsp;1.0D;&nbsp;double&nbsp;a&nbsp;=&nbsp;0.0D;&nbsp;double&nbsp;a_tmp&nbsp;=&nbsp;0.0D;&nbsp;double&nbsp;s&nbsp;=&nbsp;1.0D;&nbsp;double&nbsp;step&nbsp;=&nbsp;1.0D; &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;x&nbsp;=&nbsp;start_x;&nbsp;int&nbsp;y&nbsp;=&nbsp;start_y; &nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(r&nbsp;<&nbsp;max_r)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(isClean(bitMap,&nbsp;x,&nbsp;y,&nbsp;w,&nbsp;h))&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;targetX&nbsp;=&nbsp;bit2pixel(x); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;targetY&nbsp;=&nbsp;bit2pixel(y); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;new&nbsp;Rectangle(targetX,&nbsp;targetY,&nbsp;(int)rect.getWidth(),&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(int)rect.getHeight()); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a_tmp&nbsp;=&nbsp;s&nbsp;/&nbsp;r&nbsp;>&nbsp;0.7853981633974483D&nbsp;?&nbsp;0.7853981633974483D&nbsp;:&nbsp;s&nbsp;/&nbsp;r; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;+=&nbsp;a_tmp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r&nbsp;+=&nbsp;step&nbsp;*&nbsp;(a_tmp&nbsp;/&nbsp;6.283185307179586D); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x&nbsp;=&nbsp;(int)(Math.sin(a)&nbsp;*&nbsp;r&nbsp;*&nbsp;wRatio&nbsp;+&nbsp;start_x); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;y&nbsp;=&nbsp;(int)(Math.cos(a)&nbsp;*&nbsp;r&nbsp;*&nbsp;hRatio&nbsp;+&nbsp;start_y); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;null; &nbsp;&nbsp;} &nbsp;&nbsp;private&nbsp;Rectangle2D&nbsp;findSpace2(BitMap&nbsp;bitMap,&nbsp;Rectangle2D&nbsp;rect)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;w&nbsp;=&nbsp;pixel2bitMap((int)rect.getWidth()); &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;h&nbsp;=&nbsp;pixel2bitMap((int)rect.getHeight()); &nbsp;&nbsp;&nbsp;&nbsp;int[]&nbsp;bounds&nbsp;=&nbsp;{&nbsp;bitMap.getWidth()&nbsp;-&nbsp;w,&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bitMap.getHeight()&nbsp;-&nbsp;h&nbsp;}; &nbsp;&nbsp;&nbsp;&nbsp;int[]&nbsp;step_len&nbsp;=&nbsp;new&nbsp;int[2]; &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;marchDir&nbsp;=&nbsp;0; &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;x; &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;y; &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(bounds[0]&nbsp;>&nbsp;bounds[1])&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;y&nbsp;=&nbsp;bounds[1]&nbsp;/&nbsp;2; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;x&nbsp;=&nbsp;y; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bounds[0]&nbsp;-=&nbsp;bounds[1]; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;step_len[1]&nbsp;=&nbsp;1; &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;marchDir&nbsp;=&nbsp;3; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x&nbsp;=&nbsp;bounds[0]&nbsp;/&nbsp;2; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;y&nbsp;=&nbsp;x; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;step_len[0]&nbsp;=&nbsp;1; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bounds[1]&nbsp;-=&nbsp;bounds[0]; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(step_len[1]&nbsp;==&nbsp;0)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;step_len[1]&nbsp;=&nbsp;1; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;int[]&nbsp;step&nbsp;=&nbsp;new&nbsp;int[4]; &nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(!isClean(bitMap,&nbsp;x,&nbsp;y,&nbsp;w,&nbsp;h))&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;step[marchDir]&nbsp;+=&nbsp;1; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(step[marchDir]&nbsp;>&nbsp;step_len[(marchDir&nbsp;%&nbsp;2)])&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;step[marchDir]&nbsp;=&nbsp;0; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;step_len[(marchDir&nbsp;%&nbsp;2)]&nbsp;+=&nbsp;1; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;marchDir++;&nbsp;marchDir&nbsp;%=&nbsp;4; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(step_len[(marchDir&nbsp;%&nbsp;2)]&nbsp;>&nbsp;bounds[(marchDir&nbsp;%&nbsp;2)])&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;null; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;switch&nbsp;(marchDir)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x++; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;1: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;y--; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;2: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x--; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;3: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;y++; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;targetX&nbsp;=&nbsp;bit2pixel(x); &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;targetY&nbsp;=&nbsp;bit2pixel(y); &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;new&nbsp;Rectangle(targetX,&nbsp;targetY,&nbsp;(int)rect.getWidth(),&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(int)rect.getHeight()); &nbsp;&nbsp;} &nbsp;&nbsp;private&nbsp;int&nbsp;pixel2bitMap(int&nbsp;v)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(int)Math.ceil(v&nbsp;/&nbsp;4.0D); &nbsp;&nbsp;} &nbsp;&nbsp;private&nbsp;boolean&nbsp;isClean(BitMap&nbsp;bitMap,&nbsp;int&nbsp;x,&nbsp;int&nbsp;y,&nbsp;int&nbsp;w,&nbsp;int&nbsp;h)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((x&nbsp;<&nbsp;0)&nbsp;||&nbsp;(x&nbsp;+&nbsp;w&nbsp;>=&nbsp;bitMap.getWidth())&nbsp;||&nbsp;(y&nbsp;<&nbsp;0)&nbsp;||&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(y&nbsp;+&nbsp;h&nbsp;>=&nbsp;bitMap.getHeight())) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;false; &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;x;&nbsp;i&nbsp;<&nbsp;x&nbsp;+&nbsp;w;&nbsp;i++)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;j&nbsp;=&nbsp;y;&nbsp;j&nbsp;<&nbsp;y&nbsp;+&nbsp;h;&nbsp;j++)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(bitMap.isUsed(i,&nbsp;j)) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;false; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;true; &nbsp;&nbsp;} &nbsp;&nbsp;private&nbsp;int&nbsp;bit2pixel(int&nbsp;v)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;v&nbsp;*&nbsp;4; &nbsp;&nbsp;} &nbsp;&nbsp;private&nbsp;void&nbsp;paintOneWord(BufferedImage&nbsp;bi,&nbsp;Graphics2D&nbsp;g2,&nbsp;String&nbsp;word,&nbsp;int&nbsp;direction,&nbsp;Rectangle2D&nbsp;rect,&nbsp;Rectangle2D&nbsp;orgBounds) &nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;g2.setPaint(randomColor()); &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(direction&nbsp;==&nbsp;1)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g2.rotate(1.570796326794897D,&nbsp;rect.getX(),&nbsp;rect.getY()); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g2.drawString(word,&nbsp;(int)rect.getX(),&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(int)(rect.getY()&nbsp;-&nbsp;rect.getWidth()&nbsp;-&nbsp;orgBounds.getY())); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g2.rotate(-1.570796326794897D,&nbsp;rect.getX(),&nbsp;rect.getY()); &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;if&nbsp;(direction&nbsp;==&nbsp;2)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g2.rotate(-1.570796326794897D,&nbsp;rect.getX(),&nbsp;rect.getY()); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g2.drawString(word,&nbsp;(int)(rect.getX()&nbsp;-&nbsp;rect.getHeight()),&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(int)(rect.getY()&nbsp;-&nbsp;orgBounds.getY())); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g2.rotate(1.570796326794897D,&nbsp;rect.getX(),&nbsp;rect.getY()); &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g2.drawString(word,&nbsp;(int)rect.getX(),&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(int)(rect.getY()&nbsp;-&nbsp;orgBounds.getY())); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;bi.flush(); &nbsp;&nbsp;} &nbsp;&nbsp;private&nbsp;Paint&nbsp;randomColor() &nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;rgb&nbsp;=&nbsp;COLORS[((int)(Math.random()&nbsp;*&nbsp;10000.0D)&nbsp;%&nbsp;COLORS.length)]; &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;new&nbsp;Color(rgb); &nbsp;&nbsp;} &nbsp;&nbsp;private&nbsp;void&nbsp;updateBitMap(BitMap&nbsp;bitMap,&nbsp;BufferedImage&nbsp;bi,&nbsp;Rectangle2D&nbsp;rect)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;l&nbsp;=&nbsp;(int)rect.getX(); &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;t&nbsp;=&nbsp;(int)rect.getY(); &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;r&nbsp;=&nbsp;l&nbsp;+&nbsp;(int)rect.getWidth(); &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;b&nbsp;=&nbsp;t&nbsp;+&nbsp;(int)rect.getHeight(); &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(l&nbsp;<&nbsp;0) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;l&nbsp;=&nbsp;0; &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(t&nbsp;<&nbsp;0) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t&nbsp;=&nbsp;0; &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(r&nbsp;>&nbsp;bi.getWidth()) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r&nbsp;=&nbsp;bi.getWidth(); &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(b&nbsp;>&nbsp;bi.getHeight()) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;=&nbsp;bi.getHeight(); &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((r&nbsp;<=&nbsp;l)&nbsp;||&nbsp;(b&nbsp;<=&nbsp;t))&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;y&nbsp;=&nbsp;t;&nbsp;y&nbsp;<&nbsp;b&nbsp;+&nbsp;4&nbsp;-&nbsp;1;&nbsp;y&nbsp;+=&nbsp;4) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;x&nbsp;=&nbsp;l;&nbsp;x&nbsp;<&nbsp;r&nbsp;+&nbsp;4&nbsp;-&nbsp;1;&nbsp;x&nbsp;+=&nbsp;4) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;16;&nbsp;i++)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;x2&nbsp;=&nbsp;x&nbsp;+&nbsp;i&nbsp;%&nbsp;4; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;y2&nbsp;=&nbsp;y&nbsp;+&nbsp;i&nbsp;/&nbsp;4; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((x2&nbsp;>=&nbsp;bi.getWidth())&nbsp;||&nbsp;(y2&nbsp;>=&nbsp;bi.getHeight())) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(bi.getRGB(x&nbsp;+&nbsp;i&nbsp;%&nbsp;4,&nbsp;y&nbsp;+&nbsp;i&nbsp;/&nbsp;4)&nbsp;!=&nbsp;0)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bitMap.setUsed(pixel2bitMap(x),&nbsp;pixel2bitMap(y),&nbsp;true); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;} &nbsp;&nbsp;public&nbsp;BufferedImage&nbsp;mixImages(BufferedImage[]&nbsp;images,&nbsp;Float[]&nbsp;alphas,&nbsp;int&nbsp;width,&nbsp;int&nbsp;height) &nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;mixImages(images,&nbsp;alphas,&nbsp;createBufferedImage(width,&nbsp;height)); &nbsp;&nbsp;} &nbsp;&nbsp;public&nbsp;BufferedImage&nbsp;mixImages(BufferedImage[]&nbsp;images,&nbsp;Float[]&nbsp;alphas,&nbsp;BufferedImage&nbsp;targetImage) &nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((images&nbsp;==&nbsp;null)&nbsp;||&nbsp;(images.length&nbsp;<&nbsp;1)) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;targetImage; &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(targetImage&nbsp;==&nbsp;null)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;images.length;&nbsp;i++)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(images[i]&nbsp;!=&nbsp;null)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;targetImage&nbsp;=&nbsp;createBufferedImage(images[0].getWidth(),&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;images[0].getHeight()); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(targetImage&nbsp;==&nbsp;null) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;null; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;Graphics2D&nbsp;g2&nbsp;=&nbsp;targetImage.createGraphics(); &nbsp;&nbsp;&nbsp;&nbsp;float&nbsp;alpha&nbsp;=&nbsp;1.0F; &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;images.length;&nbsp;i++)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(images[i]&nbsp;==&nbsp;null) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((alphas&nbsp;!=&nbsp;null)&nbsp;&&&nbsp;(i&nbsp;<&nbsp;alphas.length)&nbsp;&&&nbsp;(alphas[i]&nbsp;!=&nbsp;null)) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alpha&nbsp;=&nbsp;alphas[i].floatValue(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alpha&nbsp;=&nbsp;1.0F; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g2.setComposite(AlphaComposite.getInstance(3,&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alpha)); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g2.drawImage(images[i],&nbsp;0,&nbsp;0,&nbsp;targetImage.getWidth(),&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;targetImage.getHeight(),&nbsp;0,&nbsp;0,&nbsp;images[i].getWidth(),&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;images[i].getHeight(),&nbsp;null); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;g2.dispose(); &nbsp;&nbsp;&nbsp;&nbsp;targetImage.flush(); &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;targetImage; &nbsp;&nbsp;} &nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args)&nbsp;throws&nbsp;IOException&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;fileName&nbsp;=&nbsp;"./wordsthumb.png"; &nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;bgPic&nbsp;=&nbsp;null; &nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;waterMarkPic&nbsp;=&nbsp;null; &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;width&nbsp;=&nbsp;640;&nbsp;int&nbsp;height&nbsp;=&nbsp;480; &nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;fontName&nbsp;=&nbsp;"微软雅黑"; &nbsp;&nbsp;&nbsp;&nbsp;Map&nbsp;words&nbsp;=&nbsp;new&nbsp;HashMap(); &nbsp;&nbsp;&nbsp;&nbsp;try &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;i&nbsp;=&nbsp;0; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;args.length;&nbsp;i++)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;("-o".equals(args[i]))&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i++;&nbsp;fileName&nbsp;=&nbsp;args[i]; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;if&nbsp;("-b".equals(args[i]))&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i++;&nbsp;bgPic&nbsp;=&nbsp;args[i]; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;if&nbsp;("-m".equals(args[i]))&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i++;&nbsp;waterMarkPic&nbsp;=&nbsp;args[i]; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;if&nbsp;("-w".equals(args[i]))&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i++;&nbsp;width&nbsp;=&nbsp;Integer.parseInt(args[i]); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;if&nbsp;("-h".equals(args[i]))&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i++;&nbsp;height&nbsp;=&nbsp;Integer.parseInt(args[i]);&nbsp;}&nbsp;else&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!"-f".equals(args[i]))&nbsp;break; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i++;&nbsp;fontName&nbsp;=&nbsp;args[i]; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(;&nbsp;i&nbsp;<&nbsp;args.length&nbsp;-&nbsp;1;&nbsp;i&nbsp;+=&nbsp;2) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;words.put(args[i],&nbsp;Integer.valueOf(Integer.parseInt(args[(i&nbsp;+&nbsp;1)]))); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;catch&nbsp;(RuntimeException&nbsp;e)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Usage:&nbsp;"&nbsp;+&nbsp;WordsThumb.class.getName()&nbsp;+&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"&nbsp;[options]&nbsp;<word&nbsp;frequency>..."); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("\t-o:\tOutput&nbsp;image&nbsp;file&nbsp;name"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("\t-b:\tBackground&nbsp;image&nbsp;file&nbsp;name"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("\t-m:\tWater&nbsp;mark&nbsp;image&nbsp;file&nbsp;name"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("\t-w:\tWidth&nbsp;of&nbsp;target&nbsp;image"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("\t-h:\tHeight&nbsp;of&nbsp;target&nbsp;image"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("\t-f:\tFont&nbsp;name"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.exit(1); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(words.size()&nbsp;<&nbsp;1)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;readWords(words); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(words.size()&nbsp;<&nbsp;1)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;WordsThumb&nbsp;wt&nbsp;=&nbsp;new&nbsp;WordsThumb(); &nbsp;&nbsp;&nbsp;&nbsp;BufferedImage&nbsp;bi&nbsp;=&nbsp;wt.createWordsThumb(words,&nbsp;width,&nbsp;height,&nbsp;fontName,&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;null,&nbsp;null); &nbsp;&nbsp;&nbsp;&nbsp;BufferedImage&nbsp;bg&nbsp;=&nbsp;null;&nbsp;BufferedImage&nbsp;wm&nbsp;=&nbsp;null; &nbsp;&nbsp;&nbsp;&nbsp;Float&nbsp;fgAlpha&nbsp;=&nbsp;Float.valueOf(0.8F);&nbsp;Float&nbsp;wmAlpha&nbsp;=&nbsp;Float.valueOf(1.0F); &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(bgPic&nbsp;!=&nbsp;null) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bg&nbsp;=&nbsp;ImageIO.read(new&nbsp;FileInputStream(bgPic)); &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(waterMarkPic&nbsp;!=&nbsp;null)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wm&nbsp;=&nbsp;ImageIO.read(new&nbsp;FileInputStream(waterMarkPic)); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;bi&nbsp;=&nbsp;wt.mixImages(new&nbsp;BufferedImage[]&nbsp;{&nbsp;bg,&nbsp;bi,&nbsp;wm&nbsp;},&nbsp;new&nbsp;Float[]&nbsp;{&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Float.valueOf(1.0F),&nbsp;fgAlpha,&nbsp;wmAlpha&nbsp;},&nbsp;bi.getWidth(),&nbsp;bi.getHeight()); &nbsp;&nbsp;&nbsp;&nbsp;File&nbsp;file&nbsp;=&nbsp;new&nbsp;File(fileName); &nbsp;&nbsp;&nbsp;&nbsp;ImageIO.write(bi,&nbsp;"png",&nbsp;file); &nbsp;&nbsp;} &nbsp;&nbsp;private&nbsp;static&nbsp;void&nbsp;readWords(Map<String,&nbsp;Integer>&nbsp;words)&nbsp;throws&nbsp;IOException &nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;BufferedReader&nbsp;rd&nbsp;=&nbsp;new&nbsp;BufferedReader(new&nbsp;InputStreamReader(System.in)); &nbsp;&nbsp;&nbsp;&nbsp;System.out.println("请输入词汇和词频,格式为每行一个词、一个空格、一个词频数字,以空行结束输入。"); &nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;line&nbsp;=&nbsp;null; &nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;((line&nbsp;=&nbsp;rd.readLine())&nbsp;!=&nbsp;null)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;line&nbsp;=&nbsp;line.trim(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;("".equals(line))&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("好,马上处理!"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String[]&nbsp;parts&nbsp;=&nbsp;line.split("\\s+"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(parts.length&nbsp;!=&nbsp;2)&nbsp;continue; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;words.put(parts[0],&nbsp;Integer.valueOf(Integer.parseInt(parts[1]))); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(NumberFormatException&nbsp;e)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("无效的输入。"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;} } package&nbsp;com.ctrip; import&nbsp;java.io.IOException; import&nbsp;java.io.PrintStream; public&nbsp;class&nbsp;BitMap { &nbsp;&nbsp;private&nbsp;byte[][]&nbsp;bitMap; &nbsp;&nbsp;private&nbsp;int&nbsp;width; &nbsp;&nbsp;private&nbsp;int&nbsp;height; &nbsp;&nbsp;private&nbsp;int&nbsp;byteWidth; &nbsp;&nbsp;public&nbsp;BitMap(int&nbsp;width,&nbsp;int&nbsp;height) &nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((width&nbsp;<=&nbsp;0)&nbsp;||&nbsp;(height&nbsp;<=&nbsp;0)) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;IllegalArgumentException(); &nbsp;&nbsp;&nbsp;&nbsp;this.width&nbsp;=&nbsp;width; &nbsp;&nbsp;&nbsp;&nbsp;this.height&nbsp;=&nbsp;height; &nbsp;&nbsp;&nbsp;&nbsp;this.byteWidth&nbsp;=&nbsp;(int)Math.ceil(width&nbsp;/&nbsp;8.0D); &nbsp;&nbsp;&nbsp;&nbsp;this.bitMap&nbsp;=&nbsp;new&nbsp;byte[height][this.byteWidth]; &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;y&nbsp;=&nbsp;0;&nbsp;y&nbsp;<&nbsp;height;&nbsp;y++) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;x&nbsp;=&nbsp;0;&nbsp;x&nbsp;<&nbsp;this.byteWidth;&nbsp;x++) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.bitMap[y][x]&nbsp;=&nbsp;0; &nbsp;&nbsp;} &nbsp;&nbsp;public&nbsp;int&nbsp;getWidth() &nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;this.width; &nbsp;&nbsp;} &nbsp;&nbsp;public&nbsp;int&nbsp;getHeight()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;this.height; &nbsp;&nbsp;} &nbsp;&nbsp;public&nbsp;void&nbsp;updateArea(BitMap&nbsp;bm,&nbsp;int&nbsp;x,&nbsp;int&nbsp;y) &nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;y1&nbsp;=&nbsp;y&nbsp;>=&nbsp;0&nbsp;?&nbsp;y&nbsp;:&nbsp;0;&nbsp;for&nbsp;(int&nbsp;y2&nbsp;=&nbsp;y1&nbsp;-&nbsp;y;&nbsp;(y1&nbsp;<&nbsp;this.height)&nbsp;&&&nbsp;(y2&nbsp;<&nbsp;bm.height);&nbsp;y2++)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;x1&nbsp;=&nbsp;x&nbsp;>=&nbsp;0&nbsp;?&nbsp;x&nbsp;:&nbsp;0;&nbsp;for&nbsp;(int&nbsp;x2&nbsp;=&nbsp;x1&nbsp;-&nbsp;x;&nbsp;(x1&nbsp;<&nbsp;this.byteWidth)&nbsp;&&&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(x2&nbsp;<&nbsp;bm.byteWidth);&nbsp;) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setUsed(x1,&nbsp;y1,&nbsp;bm.isUsed(x2,&nbsp;y2)); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x1++;&nbsp;x2++; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;y1++; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;} &nbsp;&nbsp;public&nbsp;boolean&nbsp;isOverlap(BitMap&nbsp;bm,&nbsp;int&nbsp;x,&nbsp;int&nbsp;y) &nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;y1&nbsp;=&nbsp;y&nbsp;>=&nbsp;0&nbsp;?&nbsp;y&nbsp;:&nbsp;0;&nbsp;for&nbsp;(int&nbsp;y2&nbsp;=&nbsp;y1&nbsp;-&nbsp;y;&nbsp;(y1&nbsp;<&nbsp;this.height)&nbsp;&&&nbsp;(y2&nbsp;<&nbsp;bm.height);&nbsp;y2++)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;x1&nbsp;=&nbsp;x&nbsp;>=&nbsp;0&nbsp;?&nbsp;x&nbsp;:&nbsp;0;&nbsp;for&nbsp;(int&nbsp;x2&nbsp;=&nbsp;x1&nbsp;-&nbsp;x;&nbsp;(x1&nbsp;<&nbsp;this.width)&nbsp;&&&nbsp;(x2&nbsp;<&nbsp;bm.width);&nbsp;x2++)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((isUsed(x1,&nbsp;y1))&nbsp;&&&nbsp;(bm.isUsed(x2,&nbsp;y2))) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;true; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x1++; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;y1++; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;false; &nbsp;&nbsp;} &nbsp;&nbsp;public&nbsp;boolean&nbsp;isUsed(int&nbsp;x,&nbsp;int&nbsp;y)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;byteX&nbsp;=&nbsp;x&nbsp;/&nbsp;8; &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((byteX&nbsp;<&nbsp;0)&nbsp;||&nbsp;(byteX&nbsp;>=&nbsp;this.byteWidth)&nbsp;||&nbsp;(y&nbsp;<&nbsp;0)&nbsp;||&nbsp;(y&nbsp;>=&nbsp;this.height)) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;IllegalArgumentException(); &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;mask&nbsp;=&nbsp;1&nbsp;<<&nbsp;7&nbsp;-&nbsp;(x&nbsp;%&nbsp;8&nbsp;+&nbsp;8)&nbsp;%&nbsp;8; &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(this.bitMap[y][byteX]&nbsp;&&nbsp;mask)&nbsp;!=&nbsp;0; &nbsp;&nbsp;} &nbsp;&nbsp;public&nbsp;void&nbsp;setUsed(int&nbsp;x,&nbsp;int&nbsp;y,&nbsp;boolean&nbsp;used)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;byteX&nbsp;=&nbsp;x&nbsp;/&nbsp;8; &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((byteX&nbsp;<&nbsp;0)&nbsp;||&nbsp;(byteX&nbsp;>=&nbsp;this.byteWidth)&nbsp;||&nbsp;(y&nbsp;<&nbsp;0)&nbsp;||&nbsp;(y&nbsp;>=&nbsp;this.height)) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;IllegalArgumentException(); &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;mask&nbsp;=&nbsp;1&nbsp;<<&nbsp;7&nbsp;-&nbsp;(x&nbsp;%&nbsp;8&nbsp;+&nbsp;8)&nbsp;%&nbsp;8; &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(used) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;tmp69_67&nbsp;=&nbsp;byteX; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byte[]&nbsp;tmp69_66&nbsp;=&nbsp;this.bitMap[y];&nbsp;tmp69_66[tmp69_67]&nbsp;=&nbsp;(byte)(tmp69_66[tmp69_67]&nbsp;|&nbsp;mask); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;else &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;tmp87_85&nbsp;=&nbsp;byteX; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byte[]&nbsp;tmp87_84&nbsp;=&nbsp;this.bitMap[y];&nbsp;tmp87_84[tmp87_85]&nbsp;=&nbsp;(byte)(tmp87_84[tmp87_85]&nbsp;&&nbsp;(mask&nbsp;^&nbsp;0xFFFFFFFF)); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;} &nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args)&nbsp;throws&nbsp;IOException&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;BitMap&nbsp;m&nbsp;=&nbsp;new&nbsp;BitMap(9,&nbsp;9); &nbsp;&nbsp;&nbsp;&nbsp;m.setUsed(1,&nbsp;1,&nbsp;true); &nbsp;&nbsp;&nbsp;&nbsp;m.debug(); &nbsp;&nbsp;&nbsp;&nbsp;BitMap&nbsp;m2&nbsp;=&nbsp;new&nbsp;BitMap(16,&nbsp;15); &nbsp;&nbsp;&nbsp;&nbsp;m2.setUsed(14,&nbsp;8,&nbsp;true); &nbsp;&nbsp;&nbsp;&nbsp;m2.debug(); &nbsp;&nbsp;&nbsp;&nbsp;m2.updateArea(m,&nbsp;0,&nbsp;0); &nbsp;&nbsp;&nbsp;&nbsp;m2.debug(); &nbsp;&nbsp;} &nbsp;&nbsp;public&nbsp;void&nbsp;debug()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;System.out.println("===&nbsp;DEBUG&nbsp;(&nbsp;"&nbsp;+&nbsp;this.width&nbsp;+&nbsp;"&nbsp;x&nbsp;"&nbsp;+&nbsp;this.height&nbsp;+&nbsp;"&nbsp;)&nbsp;==="); &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;y&nbsp;=&nbsp;0;&nbsp;y&nbsp;<&nbsp;this.height;&nbsp;y++)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;x&nbsp;=&nbsp;0;&nbsp;x&nbsp;<&nbsp;this.width;&nbsp;x++)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;boolean&nbsp;used&nbsp;=&nbsp;isUsed(x,&nbsp;y); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print(!used&nbsp;?&nbsp;"."&nbsp;:&nbsp;"*"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;} }
打开App,查看更多内容
随时随地看视频慕课网APP