2012-01-11 2 views
1

Google App Enginee에서 이미지 합성을위한 코드가 PNG 인 투명도를 따르지 않습니다. 성공적으로 투명한 png를 다른 이미지 위에 합성 할 수 있었습니까? (1.6.1). GWT에서 합성에 대해 논의한 게시물을 보았지만 유용하지는 않지만 이미 HTML5 (캔버스)의 합성물을 사용할 수 있습니다. 해결책이 GWT 캔버스를 통합하는 것이었던 http://groups.google.com/group/google-appengine-java/browse_thread/th ... 을 참조하십시오.GAE ImagesServiceFactory 컴포지트가 PNG 투명도를 사용하지 않음

I이 라인을 따라 무언가를 가지고

`

Image image = null; 

List<Composite> composites = new ArrayList<Composite>(); 

Iterator<ImageObj> iterator = images.iterator(); 

while (iterator.hasNext()) { 
    ImageObj io = (ImageObj)iterator.next(); 
    //returns an Image 
    image = io.getImage(someWidth, someHeight); 
    composites.add(ImagesServiceFactory.makeComposite(image, io.x, io.y, 1.0f, Composite.Anchor.TOP_LEFT)); 
} 

이미지 ImagesServiceFactory.getImagesService =() 복합체 (복합체 폭, 높이, 0).; `

일부 이미지는 JPEG이고 일부는 투명도가있는 PNG입니다.

이렇게 합성은 잘되지만 png 투명도는 적용되지 않습니다.

참고 - 이러한 이미지 중 일부는 750K 범위에 있으므로 이미지를 서버에서 합성하고 http를 통해 여러 이미지를 전송하는 대역폭을 줄여야합니다.

누구나이 가정에 대해 언급 할 수 있습니까? 1) GAE의 속도가 여러 개의 1M 이미지를 합성하고 개의 이미지를 하나의 이미지로 다운로드하는 것과 비교하여 동일한 복수 이미지를 브라우저에 전송하는 속도가 훨씬 빠릅니다. 2) 합성을위한 CPU의 GAE 비용은 대역폭의 GAE 비용과 비교합니까?

+0

문제 추적기 (http://code.google.com/p/googleappengine/issues/list)에서 특정 문제에 대한 링크를 추가 할 수 있다면 좋을 것입니다. –

답변

2

샘플 코드 : 아래의 Java 및 Python 예제는 이미지 API를 다음과 같이 사용합니다. 알파 채널이 포함 된 PNG 이미지 (즉, 이미지 부분이 투명 함)를 사용하여 원본 이미지가 원래 이미지 위에 겹쳐지고 폭의 절반만큼 오프셋 된 합성 이미지를 만듭니다.

sample image

다음 dev_appserver의 이미지 API의 에뮬레이션이 완전하지 않습니다. 투명도/불투명도와 같은 모든 기능이 SDK의 properly implemented은 아닙니다. 그러나 아래 예제는 모두 테스트를 거쳤으며 프로덕션 App Engine 환경에서 작동합니다.

자바 + 이미지 API :

package img; import com.google.appengine.api.images.Composite; import com.google.appengine.api.images.Image; import com.google.appengine.api.images.ImagesService; import com.google.appengine.api.images.ImagesServiceFactory; import com.google.appengine.api.images.Transform; import java.io.IOException; import java.io.RandomAccessFile; import java.util.Arrays; import java.util.Collection; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @SuppressWarnings("serial") public class ImgServlet extends HttpServlet { @Override public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { RandomAccessFile file = new RandomAccessFile("image.png", "r"); byte[] data = new byte[(int) file.length()]; file.read(data); file.close(); ImagesService imagesService = ImagesServiceFactory.getImagesService(); Image image = ImagesServiceFactory.makeImage(data); Transform resize = ImagesServiceFactory.makeResize(50, 50); image = imagesService.applyTransform(resize, image); Composite composite1 = ImagesServiceFactory.makeComposite(image, 0, 0, 1.0F, Composite.Anchor.TOP_LEFT); Composite composite2 = ImagesServiceFactory.makeComposite(image, 25, 0, 1.0F, Composite.Anchor.TOP_LEFT); Collection<Composite> composites = Arrays.asList(new Composite[] {composite1, composite2}); image = imagesService.composite( composites, 75, 50, 0, ImagesService.OutputEncoding.PNG); data = image.getImageData(); resp.setContentType("image/png"); resp.getOutputStream().write(data); } } 

파이썬 2.7 + 이미지 API :

import webapp2 
from google.appengine.api import images 

class MainHandler(webapp2.RequestHandler): 

    def get(self): 
    img = images.Image(open("image.png").read()) 
    img.resize(50, 50) 
    result = img.execute_transforms(output_encoding=images.PNG) 
    t1 = (result, 0, 0, 1.0, images.TOP_LEFT) 
    t2 = (result, 25, 0, 1.0, images.TOP_LEFT) 
    result = images.composite([t1, t2], 75, 50, color=0, 
           output_encoding=images.PNG, quality=None) 
    self.response.headers['content-type'] = 'image/png' 
    self.response.write(result) 

app = webapp2.WSGIApplication([ 
    ('/.*', MainHandler), 
], debug=True) 

파이썬 2.7 + PIL :

대안 python27 솔루션은 PIL library을 사용하고 지원되는 python27 third-party library을 사용할 수 있습니다.

import webapp2 
from StringIO import StringIO 
from PIL import Image 

class MainHandler(webapp2.RequestHandler): 

    def get(self): 
    image1 = Image.open("image1.png") 
    image2 = Image.open("image2.png") 
    image = Image.composite(image1, image2, image1) 
    result = StringIO() 
    image.save(result, "PNG") 
    self.response.headers['content-type'] = 'image/png' 
    self.response.write(result.getvalue()) 

app = webapp2.WSGIApplication([ 
    ('/.*', MainHandler), 
], debug=True) 
관련 문제