2012-01-11 27 views
1

Google App Enginee中用於圖像合成的代碼看起來不符合PNGs 的透明度。有沒有人能夠成功地在最新版本的SDK (1.6.1)中將 透明PNG複合到另一幅圖像上。我見過一篇文章,討論了GWT中的合成,但我已經可以在HTML5(canvas)中使用 合成,所以這沒什麼用。請參閱 http://groups.google.com/group/google-appengine-java/browse_thread/th ... 其中解決方案是合併GWT畫布。GAE ImagesServiceFactory複合不遵守PNG透明度

我有沿的線的東西,

`

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)中添加指向特定問題的鏈接,那將會很不錯。 – 2012-10-30 17:04:39

回答

2

示例代碼: 下面的Java和Python示例使用圖像API,如下所示。我們拍攝帶有alpha通道的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解決方案是使用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)