작업 전



작업 후


개요


위와 같이 이미지와 그 내부에 글자를 쓰고자 할 때 매번 포토샵 같은 프로그램에 들어가서 작업하려면 귀차니즘이 발동하기 때문에 힘든데 이럴때를 위해 만든 유틸성 자바 프로그램의 소스를 공유하고자 합니다. 좀 더 응용하면 더 좋은 프로그램이 나올수도 있겠네요


동작방법


자바최신 버전 설치(1.7이상 권장) 후 실행하시면 됩니다. (자바 프로그램에 대한 설명은 생략하겠습니다. main에 예제까지 넣었으니 ㅜㅜ )




소스 간단 설명


TEXT 드로잉

텍스트의 크기정보 GET

배경의 width를 텍스트에 맞춰 resize 이후 텍스트를 이미지 위에 overlay

배경 이미지 CROP 및 이미지 생성


소스

package com.wonsama.wswriter.utils; import java.awt.Color; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.Rectangle; import java.awt.RenderingHints; import java.awt.geom.AffineTransform; import java.awt.image.BufferedImage; import java.io.File; import java.net.URL; import javax.imageio.ImageIO; /** * 입력 텍스트를 이미지로 만들어 준다 * @author parkwon * @since 2017.03.24 */ public class WsImageTextUtil { /** * 테스트용 진입점 * @param args 파라미터 * @since 2017.03.24 */ public static void main(String[] args) { try{ new WsImageTextUtil(); }catch (Exception e) { e.printStackTrace(); } } /** * 생성자 * @since 2017.03.24 */ WsImageTextUtil() throws Exception { // drawText("어머니가 짜장면이 싫다고 하셨어", "/Users/parkwon/Desktop/sample.png"); String[] texts = {"아이폰 7 붉은색 사주세요"}; drawTextWithImage(texts , "/Users/parkwon/Desktop/writes/title.png" , "http://imgnews.naver.com/image/5463/2017/03/21/0000000101_003_20170322105216516.png"); } /** * 텍스트를 이미지로 만들어준다 * @param text 텍스트 * @param fileLoc 파일위치 * @throws Exception 오류 * @since 2017.03.27 */ public void drawText(String text, String fileLoc) throws Exception { Font font = new Font("나눔고딕", Font.PLAIN, 28); Rectangle r = getFontrect(text, font); int width = (int) r.getWidth(); int height = (int) r.getHeight(); BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); Graphics2D g2d = getG2D(img); g2d.setFont(font); FontMetrics fm = g2d.getFontMetrics(); g2d.setColor(Color.BLACK); g2d.drawString(text, 0, fm.getAscent()); g2d.dispose(); // 이미지 파일을 생성한다 ImageIO.write(img, "png", new File(fileLoc)); } /** * 웹 이미지 내부에 텍스트를 포함하여 이미지로 만들어준다 * @param texts 텍스트 문자열 * @param fileLoc 파일위치 * @param backgrondImageURL 웹이미지 주소 * @throws Exception 오류 * @since 2017.03.27 */ public void drawTextWithImage(String[] texts, String fileLoc, String backgrondImageURL) throws Exception { final int FONT_SIZE = 18; final int POS_X = 30; final int POS_Y = 20; BufferedImage img = ImageIO.read(new URL(backgrondImageURL)); Graphics g = img.getGraphics(); Font font = new Font("나눔고딕", Font.PLAIN, FONT_SIZE); // 우선은 첫 라인 정보만 가져온다. 일반적으로 가장 길게 설정하는 것이 맞다고 생각함. Rectangle rect = getFontrect(texts[0], font); int oriWidth = img.getWidth(); int oriHeight = img.getHeight(); double ratio = (rect.getWidth() + POS_X*2) / oriWidth; int newWidth = (int) (rect.getWidth() + POS_X*2); int newHeight = (int) (oriHeight * ratio); // 배경 이미지 RESIZE 처리 img = resizeImage(img, newWidth, newHeight*texts.length); // 텍스트 처리 for(int i=0;i<texts.length;i++){ Graphics2D g2d = getG2D(img); g2d.setFont(font); int x = POS_X; int y = (FONT_SIZE + POS_Y)*(i + 1); // 그림자 처리 drawStringDropshadow(g2d, texts[i], x, y); } g.dispose(); // 배경 이미지 CROP 처리 img = cropImage(img, new Rectangle(0, 0, newWidth, (FONT_SIZE+POS_Y)*texts.length+POS_Y) ); // 이미지 파일을 생성한다 ImageIO.write(img, "png", new File(fileLoc)); } /** * 입력받은 문자열의 사각영역을 반환한다 * @param text 문자열 * @param font 폰트 * @return 사각크기 * @since 2017.03.24 */ private Rectangle getFontrect(String text, Font font){ BufferedImage img = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB); Graphics2D g2d = img.createGraphics(); g2d.setFont(font); FontMetrics fm = g2d.getFontMetrics(); int width = fm.stringWidth(text); int height = fm.getHeight(); g2d.dispose(); return new Rectangle(0, 0, width, height); } /** * 아웃라인 처리 * @param g2d 2D 그래픽스 * @param text 문자열 * @param x X좌표 * @param y Y좌표 * @param cin 내부 색상 * @param cout 외부 색상 * @since 2017.03.27 */ private void drawStringOutline(Graphics2D g2d, String text, int x, int y, Color cin, Color cout){ g2d.setColor(cout); g2d.drawString(text, ShiftWest(x, 1), ShiftNorth(y, 1)); g2d.drawString(text, ShiftWest(x, 1), ShiftSouth(y, 1)); g2d.drawString(text, ShiftEast(x, 1), ShiftNorth(y, 1)); g2d.drawString(text, ShiftEast(x, 1), ShiftSouth(y, 1)); g2d.setColor(cin); g2d.drawString(text, x, y); } /** * 그림자 텍스트를 그려준다 * @param g2d 2D 그래픽스 * @param text 문자열 * @param x X좌표 * @param y Y좌표 * @since 2017.03.27 */ private void drawStringDropshadow(Graphics2D g2d, String text, int x, int y) { g2d.setColor(new Color(20, 20, 20)); g2d.drawString(text, ShiftEast(x, 2), ShiftSouth(y, 2)); g2d.setColor(new Color(220, 220, 220)); g2d.drawString(text, x, y); } /** * 폰트를 회전 처리한다 * @param font 폰트 * @param angle 회전각 0~360 / -를 넣으면 반시계 방향으로 계산 * @return 회전처리 된 폰트 * @since 2017.03.24 */ private Font rotatedFont(Font font, double angle){ // 폰트 회전처리 AffineTransform form = new AffineTransform(); form.rotate(Math.toRadians(angle), 0, 0); return font.deriveFont(form); } /** * 이미지 크롭처리 * @param img 이미지 * @param rect 사각정보 * @return 신규 이미지 * @since 2017.03.24 */ private BufferedImage cropImage(BufferedImage img, Rectangle rect) { BufferedImage dest = img.getSubimage(rect.x, rect.y, rect.width, rect.height); return dest; } /** * 이미지 리사이징 * @param img 이미지 * @param newW 새로운 넓이 * @param newH 새로운 높이 * @return 신규 이미지 * @since 2017.03.24 */ private BufferedImage resizeImage(BufferedImage img, int newW, int newH) { Image tmp = img.getScaledInstance(newW, newH, Image.SCALE_SMOOTH); BufferedImage dimg = new BufferedImage(newW, newH, BufferedImage.TYPE_INT_ARGB); Graphics2D g2d = dimg.createGraphics(); g2d.drawImage(tmp, 0, 0, null); g2d.dispose(); return dimg; } /** * 이미지에서 2D 그래픽스 개체를 얻어온다 * @param img 이미지버퍼 * @return 2D 그래픽스 * @since 2017.03.24 */ private Graphics2D getG2D(BufferedImage img) { Graphics2D g2d = img.createGraphics(); g2d.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY); g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2d.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY); g2d.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_ENABLE); g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON); g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); g2d.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE); return g2d; } /** * 좌표 이동처리 - 위쪽 / 북 * @param p 현 좌표 * @param distance 이동거리 * @return 변경된 좌표 * @since 2017.03.27 */ int ShiftNorth(int p, int distance) { return (p - distance); } /** * 좌표 이동처리 - 아래쪽 / 남 * @param p 현 좌표 * @param distance 이동거리 * @return 변경된 좌표 * @since 2017.03.27 */ int ShiftSouth(int p, int distance) { return (p + distance); } /** * 좌표 이동처리 - 오른쪽 / 동 * @param p 현 좌표 * @param distance 이동거리 * @return 변경된 좌표 * @since 2017.03.27 */ int ShiftEast(int p, int distance) { return (p + distance); } /** * 좌표 이동처리 - 왼쪽 / 서 * @param p 현 좌표 * @param distance 이동거리 * @return 변경된 좌표 * @since 2017.03.27 */ int ShiftWest(int p, int distance) { return (p - distance); } }


Android O 의 새로운 기능알림 알림 채널, 배경 한도, PIP 등



Android O의 새로운 기능 

: 백그라운드 한계, 알림 채널, PIP (picture-in-picture), 자동 채우기, 적응 형 아이콘 및 API 변경 등이 추가되었습니다.


알림 채널. 

사용자는 채널 소개를 통해 알림을보다 효과적으로 제어 할 수 있습니다. 이 채널은 여러 응용 프로그램의 메시지를 그룹화 할 수 있으며 사용자는 채널을 활성화 / 비활성화하거나 잠금 화면에서 중요도, 사운드, 조명, 진동, 가시성 중 하나의 설정을 적용 할 수 있습니다. 알림에는 더 이상 우선 순위가 지정되지 않으며, 알림이 표시되는 방법과 노이즈, 빛 또는 진동과 관련된 채널을 결정하는 새로운 7 가지 중요도가 제공됩니다. 여러 사용자 계정에 채널을 그룹화 할 수 있습니다. 이는 업무용 및 개인용으로 사용되는 장치에서 채널을 관리하는 데 유용합니다.


백그라운드 제한. 

Android O는 배터리 수명과 성능을 향상시키기 위해 더 많은 백그라운드 제한을 도입합니다. 새 제한의 영향을받는 영역은 암시 적 브로드 캐스트, 백그라운드 서비스 및 위치 업데이트입니다. 백그라운드에서 실행중인 서비스는 몇 분 후에 중지됩니다. 이러한 서비스를 사용하는 응용 프로그램은 제한없는 서비스를 시작할 수있는 몇 분 동안 임시 허용 목록에 배치 될 수 있습니다. 이는 우선 순위가 높은 메시지, 브로드 캐스트 수신시 또는 통지에서 보류중인 인 텐트를 실행할 때와 같이 사용자가 볼 수있는 작업을 응용 프로그램이 처리해야하는 경우에 발생합니다.

위치 업데이트와 관련하여 백그라운드에서 실행되는 응용 프로그램은 매 시간마다 이러한 업데이트를 수신합니다. 응용 프로그램은 포 그라운드로 응용 프로그램을 가져 오거나, 포 그라운드 서비스를 사용하거나, Geofencing API를 사용하거나 수동 위치 수신기를 사용하여이 동작을 변경할 수 있습니다.



PIP (Picture-in-picture). 

Android TV에서 이미 사용 가능하며 PIP는 이제 Android로 가져와 다른 활동 내에서 활동을 표시 할 수 있습니다. PIP는 Android N에 도입 된 멀티 윈도우의 특별한 경우이며 특히 동영상 콘텐츠를 재생하는 데 적합합니다.

자동 완성 프레임 워크. Android O는 사용자가 시간을 절약하고 양식 작성 작업을 반복하지 않기 위해 애플리케이션이 데이터 및 자동 완성 양식을 저장하는 데 사용할 수있는 프레임 워크를 도입합니다. 로그인 데이터 또는 신용 카드 정보 사용에 대한 예가 포함됩니다.


적응 형 아이콘. 

다양한 기기의 실행 프로그램은 둥근 모양, 사각형 모양, squircle 모양 등 다른 모양의 아이콘을 표시 할 수 있습니다. Android O는 배경과 전경을위한 두 개의 이미지 레이어와 마스크로 시작 아이콘을 만듭니다. 이 아이콘은 시각 효과를 지원합니다.

멀티 디스플레이. 개발자는 여러 디스플레이가있는 장치에서 활동을 한 디스플레이에서 다른 디스플레이로 이동할 수 있습니다.


자바. 

Android O에는 OpenJDK 8의 java.time과 OpenJDK 7의 java.nio.file 및 java.lang.invoke가 포함되어 있습니다. 일부 벤치 마크에서는 런타임 성능이 최대 2 배 향상되었습니다.

Android O의 다른 개선 사항에는 XML의 글꼴 리소스, 앱의 광역 색상, 고품질 Bluetooth 오디오 코덱, WiFi 인식, 키보드 탐색, WebView 개선 등이 있습니다.


Google은이 Android 미리보기 버전은 완전히 안정적이지 않으며 후속 버전은 다음 달에 발행 될 것입니다. 

Android O 용으로 개발하려면 Android Studio 2.4 Canary가 필요합니다. 

Android의 새 버전은 에뮬레이터 또는 여러 Nexus 및 Pixel 기기에서 테스트 할 수 있습니다.


출처 : https://www.infoq.com/news/2017/03/android-o?utm_campaign=infoq_content&utm_source=infoq&utm_medium=feed&utm_term=global




matches

문서 내에서 특정 단어 또는 구문을 찾을 때 유용함.


단점, 한글이 안됨 -_-;


출처 : http://alvinalexander.com/blog/post/java/java-how-case-insensitive-search-string-matches-method



'기타 > Old' 카테고리의 다른 글

[Arduino] 사운드 센서  (0) 2015.06.26
highlight 강조 표현 처리  (0) 2015.06.18
cordova - platform support  (0) 2015.06.05
cordova - overview  (0) 2015.06.05
안드로이드 PC로 연결이 안되는 경우  (0) 2015.06.02

출처 : http://neoguru.tistory.com/17


maven에 다른 repository 추가하는 방법


 <repositories>

  <repository>

   <id>jboss-repository</id>

   <name>Jboss Repository for Maven</name>

   <url>http://repository.jboss.com/maven2</url>

  </repository>

 </repositories>





제목

전자정부 프레임 워크 개요


상세 내용

전자 정부 프레임워크의 개발 환경관련 내용을 PDF에서 정리하여 대략적으로 설명함.


출처 : 

표준프레임워크 개발자 교육 교재 및 실습 (V2.5 반영) patch 2013.02.18

http://www.egovframe.org/cop/bbs/selectBoardArticle.do?menu=4&amp;submenu=2


구성 요소








관련링크

Apache Maven

– http://maven.apache.org/

Maven Central Repository

 – http://mvnrepository.com/

M2eclipse

– http://m2eclipse.codehaus.org/

Nexus

– http://www.sonatype.com/books/nexus-book/reference/


Unitils Guildelines

– http://unitils.sourceforge.net/guidelines.html 

Mock Object 사용해서 쉽게 테스트하기

– http://www.ibm.com/developerworks/kr/event/screencast/final/01/ 

mock object

– http://www.mockobjects.com/ 

Effective Unit Testing with DbUnit

– http://www.onjava.com/pub/a/onjava/2004/01/21/dbunit.html 

What is a mock objects

– http://www.shinetech.com/display/www/What+Are+Mock+Objects%3F 

An early look at JUnit4

– http://www.ibm.com/developerworks/java/library/j-junit4.html 

JUnit FAQ

– http://junit.sourceforge.net/doc/faq/faq.htm


Subversion Project Home Page

– http://subversion.tigris.org/

CVS Project Home Page

– http://www.nongnu.org/cvs/

Subversive Eclipse Plug-in

– http://www.eclipse.org/subversive/

Subversive SVN Connectors Eclipse Plug-in

– http://www.polarion.com/products/svn/subversive.php?src=eclipseproject

Subclipse Eclipse Plug-in

– http://subclipse.tigris.org/


CI 정의

– http://en.wikipedia.org/wiki/Continuous_Integration

Continuous Integration (Martin Fowler)

– http://martinfowler.com/articles/continuousIntegration.html#AutomateDeployment

Hudson Home

– https://hudson.dev.java.net/


jTrac Home

– http://www.jtrac.info/



java heap space 애러 발생 시 대처 방법

export CATALINA_OPTS=”-Xms256m -Xmx512m”

or

export JAVA_OPTS=”-Xms256m -Xmx512m”

+ Recent posts