2012-01-11 7 views
1

Google App Engineeの画像コンポジットのコードは、PNGの 透過性を尊重しているようには見えません。誰でも、 トランスペアレントpngを、最新バージョンのSDK (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の複数の画像を合成し、 の画像を1つの画像にダウンロードするのと比べて、同じ複数の画像をブラウザよりも速くダウンロードするのに比べてはるかに速いですか? 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環境で動作しています。

のJava +画像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); } } 

のPython 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) 

のPython 2。7 + PIL:

代替python27溶液をサポートpython27 third-party libraryとして入手PIL 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) 
関連する問題