SSISO Community

시소당

[JAI] Transparency PNG 파일 만들기.

일때문에 이미지 파일을 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


632 view

4.0 stars