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