package gotnames.dm;
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.OutputSettings;
import com.google.appengine.api.images.Transform;
import com.google.appengine.api.images.Image.Format;
import com.google.appengine.api.images.ImagesService.OutputEncoding;
import com.medallia.tiny.Encoding;
/**
* Class which stores information about a profile picture. It has the profile
* picture data as a byte[] as well as the width and height and md5 of the
* image.
*/
public class ProfilePictureData {
public final byte[] image;
public final String md5;
public final int width, height;
ProfilePictureData(byte[] image, String md5, int width, int height) {
this.image = image;
this.md5 = md5;
this.width = width;
this.height = height;
}
/**
* Read the given picture bytes and create a canonical
* {@link ProfilePictureData}. The picture can be in any format supported by
* AppEngine, but it will be resized to a standard size and converted to
* JPEG.
*/
public static ProfilePictureData getProfilePicture(byte[] rawProfilePictureBytes) {
if (rawProfilePictureBytes == null || rawProfilePictureBytes.length == 0)
return null;
Image uploadedImage = ImagesServiceFactory.makeImage(rawProfilePictureBytes);
Image profilePicture = normalizeProfilePicture(uploadedImage);
byte[] imageData = profilePicture.getImageData();
return new ProfilePictureData(imageData, Encoding.md5(imageData), profilePicture.getWidth(), profilePicture.getHeight());
}
private static Image normalizeProfilePicture(Image uploadedImage) {
ImagesService imagesService = ImagesServiceFactory.getImagesService();
Transform resize = ImagesServiceFactory.makeResize(250, 500);
OutputSettings jpeg = new OutputSettings(OutputEncoding.JPEG);
Image profileImage = imagesService.applyTransform(resize, uploadedImage, jpeg);
if (profileImage.getFormat() != Format.JPEG)
throw new AssertionError("Wrong format: " + profileImage.getFormat());
return profileImage;
}
}