일때문에 이미지 파일을 Scale and Crop 하는 녀석을 만들다가..
모서리를 둥글게 깎아줘보고 싶어서 둥글게 깎아보고..
깎인 부분을 투명하게 해보고 싶어서 투명하게 해봤다..
조낸 삽질 후 얻은 결과-
1. scale & crop 하는법은 pass - google 님께 물어보면 조낸 나온다.
2. 투명효과 주기
a. RenderdOp 의 format을 ComponentColorModel을 사용하도록 변경해준다.
ComponentColorModel ccm = new ComponentColorModel(ICC_ColorSpace.getInstance(ICC_ColorSpace.CS_LINEAR_RGB),
false, false, ComponentColorModel.OPAQUE, DataBuffer.TYPE_BYTE);
ccm.createCompatibleSampleModel(srcImg.getWidth(), srcImg.getHeight());
ImageLayout imgLayout = new ImageLayout();
imgLayout.setColorModel(ccm);
imgLayout.setTileWidth(srcImg.getWidth());
imgLayout.setTileHeight(srcImg.getHeight());
Hashtable ht = new Hashtable();
ht.put(JAI.KEY_REPLACE_INDEX_COLOR_MODEL, Boolean.TRUE);
ht.put(JAI.KEY_IMAGE_LAYOUT, imgLayout);
RenderingHints hints = new RenderingHints(ht);
ParameterBlock pbc = new ParameterBlock();
pbc.addSource(srcImg);
pbc.add(DataBuffer.TYPE_BYTE);
RenderedOp opReform = JAI.create("Format", pbc, hints);
b. 모서리 깎기
BufferedImage를 생성한후 RGB 채널과 Alpha채널의 WritableRaster를 생성한다.
RGB채널에는 위에서 포맷을 변경한 opReform 의 Raster값을 가져와서 복사하고
Alpha채널에는 모서리를 깍기 위한 알파값을 넣어준다.. 조낸 노가다-
BufferedImage bufImg = new BufferedImage(opReform.getWidth(), opReform.getHeight(), BufferedImage.TYPE_INT_ARGB);
WritableRaster wr = bufImg.getWritableTile(0,0);
WritableRaster wr3 = wr.createWritableChild(0, 0, opReform.getWidth(), opReform.getHeight(), 0, 0, new int[] {0,1,2});
wr3.setRect(0-(int)cropx, 0-(int)cropy, opReform.getData());
WritableRaster wr1 = wr.createWritableChild(0, 0, opReform.getWidth(), opReform.getHeight(), 0, 0, new int[] {3});
int[] arr = new int[opReform.getWidth()*opReform.getHeight()];
for(int i=0; i<arr.length; i++) arr[i] = 255;
wr1.setPixels(0, 0, opReform.getWidth(), opReform.getHeight(), arr);
// round left-top
wr1.setPixels(0, 0, 7, 1, new int[]{0,0,0,0,0,0,127});
wr1.setPixels(0, 1, 4, 1, new int[]{0,0,0,0});
wr1.setPixels(0, 2, 3, 1, new int[]{0,0,0});
wr1.setPixels(0, 3, 2, 1, new int[]{0,0});
wr1.setPixels(0, 4, 1, 1, new int[]{0});
wr1.setPixels(0, 5, 1, 1, new int[]{0});
wr1.setPixels(0, 6, 1, 1, new int[]{127});
// round left-bottom
wr1.setPixels(0, opReform.getHeight()-1, 7, 1, new int[]{0,0,0,0,0,0,127});
wr1.setPixels(0, opReform.getHeight()-2, 4, 1, new int[]{0,0,0,0});
wr1.setPixels(0, opReform.getHeight()-3, 3, 1, new int[]{0,0,0});
wr1.setPixels(0, opReform.getHeight()-4, 2, 1, new int[]{0,0});
wr1.setPixels(0, opReform.getHeight()-5, 1, 1, new int[]{0});
wr1.setPixels(0, opReform.getHeight()-6, 1, 1, new int[]{0});
wr1.setPixels(0, opReform.getHeight()-7, 1, 1, new int[]{127});
// round right-top
wr1.setPixels(opReform.getWidth()-7, 0, 7, 1, new int[]{127,0,0,0,0,0,0});
wr1.setPixels(opReform.getWidth()-4, 1, 4, 1, new int[]{0,0,0,0});
wr1.setPixels(opReform.getWidth()-3, 2, 3, 1, new int[]{0,0,0});
wr1.setPixels(opReform.getWidth()-2, 3, 2, 1, new int[]{0,0});
wr1.setPixels(opReform.getWidth()-1, 4, 1, 1, new int[]{0});
wr1.setPixels(opReform.getWidth()-1, 5, 1, 1, new int[]{0});
wr1.setPixels(opReform.getWidth()-1, 6, 1, 1, new int[]{127});
// round right-bottom
wr1.setPixels(opReform.getWidth()-7, opReform.getHeight()-1, 7, 1, new int[]{127,0,0,0,0,0,0});
wr1.setPixels(opReform.getWidth()-4, opReform.getHeight()-2, 4, 1, new int[]{0,0,0,0});
wr1.setPixels(opReform.getWidth()-3, opReform.getHeight()-3, 3, 1, new int[]{0,0,0});
wr1.setPixels(opReform.getWidth()-2, opReform.getHeight()-4, 2, 1, new int[]{0,0});
wr1.setPixels(opReform.getWidth()-1, opReform.getHeight()-5, 1, 1, new int[]{0});
wr1.setPixels(opReform.getWidth()-1, opReform.getHeight()-6, 1, 1, new int[]{0});
wr1.setPixels(opReform.getWidth()-1, opReform.getHeight()-7, 1, 1, new int[]{127});
bufImg.releaseWritableTile(0, 0);
pb = new ParameterBlock();
pb.add(bufImg);
RenderedOp opRound = JAI.create("awtImage", pb, null);
c. 마지막으로 PNG파일 저장
// Save Thumbnail
File file = new File(thumbpath);
FileOutputStream fout = new FileOutputStream(file);
ImageEncoder encoder = ImageCodec.createImageEncoder("PNG", fout, PNGEncodeParam.getDefaultEncodeParam(opRound));
encoder.encode(opRound);
fout.close();
6시간정도 조낸 삽질하며 얻어낸 결과물.. 나름 뿌듯 :)
이런.. Animated-GIF에서는 조낸 깨진다.. 이렇게.. ㅠㅠ
ps. 왜 사진올리기에서 PNG는 안되는거샷!!!!!! 버럭!!1
[출처] [JAI] Transparency PNG 파일 만들기.|작성자 민종