GAE ImagesServiceFactory Composite не соблюдает прозрачность PNG - PullRequest
1 голос
/ 11 января 2012

Код для компоновки изображений в Google App Enginee не соответствует PNG прозрачность. Кто-нибудь смог успешно составить прозрачный png поверх другого изображения в последней версии SDK (1.6.1). Я видел пост, который обсуждал композитинг в GWT, но я уже могу составной в HTML5 (холст), так что это не полезно. Увидеть http://groups.google.com/group/google-appengine-java/browse_thread/th... где решение было включить холст GWT.

У меня есть что-то вроде

`

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)); 
}

Image = ImagesServiceFactory.getImagesService (). Composite (композиты, ширина, высота 0); `

Где некоторые изображения в формате JPEG, а некоторые в формате PNG с прозрачностью.

Итак, компоновка работает нормально, но прозрачность png не соблюдается.

Примечание. - Некоторые из этих изображений находятся в 750K диапазон, мне нужно сложить их на сервере и уменьшить пропускная способность отправки нескольких изображений через http.

Может кто-нибудь прокомментировать это предположение. 1) Является ли скорость GAE составлением нескольких изображений 1M и загрузкой одно изображение по сравнению с загрузкой этих же нескольких изображений в браузер намного быстрее? 2) Является ли GAE стоимость процессора для композитинга сопоставимой со стоимостью GAE для ширина полосы

1 Ответ

2 голосов
/ 30 октября 2012

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

sample image

Примечание : Эмуляция API изображений в dev_appserver не завершена. Не все функции, такие как прозрачность / непрозрачность, правильно реализованы в SDK. Однако все приведенные ниже примеры были протестированы и работают в рабочей среде App Engine.

API Java + Images:

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 , доступной в качестве поддерживаемой сторонней библиотеки python27 .

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...