2012-01-11 5 views
1

Код для компоновки изображений в Google App Engine не соответствует чести PNG прозрачности. Кто-нибудь смог успешно скомпоновать прозрачный png над другим изображением в последней версии SDK (1.6.1). Я видел сообщение, которое обсуждало компоновку в GWT, но я уже могу добавить в HTML5 (холст), так что это не полезно. См. 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) Является ли стоимость GAE для ЦП для компоновки сопоставимой с стоимостью GAE для полосы пропускания ?

+0

Было бы здорово, если бы вы могли добавить ссылку на конкретную проблему в трекер проблемы (http://code.google.com/p/googleappengine/issues/list). –

ответ

2

Образец кода: Приведенные ниже примеры Java и Python используют API изображений следующим образом. Мы берем PNG-изображение с альфа-каналом (т. Е. Части изображения являются прозрачными), чтобы создать составное изображение, где исходное изображение накладывается поверх него, смещение на половину его ширины.

sample image

Примечание: Эмуляция API изображений в dev_appserver является неполным. Не все функции, такие как прозрачность/непрозрачность, составляют properly implemented в SDK. Однако приведенные ниже примеры были протестированы и работали в среде 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) 
Смежные вопросы