api_dev/src/main/java/com/google/appengine/api/images/dev/LocalBlobImageServlet.java [256:318]:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  protected Image transformImage(final ParsedUrl request) {
    // Obtain the image bytes as a BufferedImage
    Status unusedStatus = new Status();
    ImageData imageData =
        ImageData.newBuilder()
            .setBlobKey(request.getBlobKey())
            .setContent(ByteString.EMPTY)
            .build();

    String originalMimeType = imagesService.getMimeType(imageData);
    BufferedImage img = imagesService.openImage(imageData, unusedStatus);

    // Apply the transform
    if (request.hasOptions()) {
      // Crop
      if (request.getCrop()) {
        Transform.Builder cropXform = null;
        float width = img.getWidth();
        float height = img.getHeight();
        if (width > height) {
          cropXform = Transform.newBuilder();
          float delta = (width - height) / (width * 2.0f);
          cropXform.setCropLeftX(delta);
          cropXform.setCropRightX(1.0f - delta);
        } else if (width < height) {
          cropXform = Transform.newBuilder();
          float delta = (height - width) / (height * 2.0f);
          float topDelta = Math.max(0.0f, delta - 0.25f);
          float bottomDelta = 1.0f - (2.0f * delta) + topDelta;
          cropXform.setCropTopY(topDelta);
          cropXform.setCropBottomY(bottomDelta);
        }
        if (cropXform != null) {
          img = imagesService.processTransform(img, cropXform.build(), unusedStatus);
        }
      }

      // Resize
      Transform resizeXform =
          Transform.newBuilder()
              .setWidth(request.getResize())
              .setHeight(request.getResize())
              .build();
      img = imagesService.processTransform(img, resizeXform, unusedStatus);
    } else if (img.getWidth() > DEFAULT_SERVING_SIZE || img.getHeight() > DEFAULT_SERVING_SIZE) {
      // Resize down to default serving size.
      Transform resizeXform =
          Transform.newBuilder()
              .setWidth(DEFAULT_SERVING_SIZE)
              .setHeight(DEFAULT_SERVING_SIZE)
              .build();
      img = imagesService.processTransform(img, resizeXform, unusedStatus);
    }

    MIME_TYPE outputMimeType = MIME_TYPE.JPEG;
    String outputMimeTypeString = "image/jpeg";
    if (transcodeToPng.contains(originalMimeType)) {
      outputMimeType = MIME_TYPE.PNG;
      outputMimeTypeString = "image/png";
    }
    return new Image(
        imagesService.saveImage(img, outputMimeType, unusedStatus), outputMimeTypeString);
  }
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -



api_dev/src/main/java/com/google/appengine/api/images/dev/ee10/LocalBlobImageServlet.java [257:319]:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  protected Image transformImage(final ParsedUrl request) {
    // Obtain the image bytes as a BufferedImage
    Status unusedStatus = new Status();
    ImageData imageData =
        ImageData.newBuilder()
            .setBlobKey(request.getBlobKey())
            .setContent(ByteString.EMPTY)
            .build();

    String originalMimeType = imagesService.getMimeType(imageData);
    BufferedImage img = imagesService.openImage(imageData, unusedStatus);

    // Apply the transform
    if (request.hasOptions()) {
      // Crop
      if (request.getCrop()) {
        Transform.Builder cropXform = null;
        float width = img.getWidth();
        float height = img.getHeight();
        if (width > height) {
          cropXform = Transform.newBuilder();
          float delta = (width - height) / (width * 2.0f);
          cropXform.setCropLeftX(delta);
          cropXform.setCropRightX(1.0f - delta);
        } else if (width < height) {
          cropXform = Transform.newBuilder();
          float delta = (height - width) / (height * 2.0f);
          float topDelta = Math.max(0.0f, delta - 0.25f);
          float bottomDelta = 1.0f - (2.0f * delta) + topDelta;
          cropXform.setCropTopY(topDelta);
          cropXform.setCropBottomY(bottomDelta);
        }
        if (cropXform != null) {
          img = imagesService.processTransform(img, cropXform.build(), unusedStatus);
        }
      }

      // Resize
      Transform resizeXform =
          Transform.newBuilder()
              .setWidth(request.getResize())
              .setHeight(request.getResize())
              .build();
      img = imagesService.processTransform(img, resizeXform, unusedStatus);
    } else if (img.getWidth() > DEFAULT_SERVING_SIZE || img.getHeight() > DEFAULT_SERVING_SIZE) {
      // Resize down to default serving size.
      Transform resizeXform =
          Transform.newBuilder()
              .setWidth(DEFAULT_SERVING_SIZE)
              .setHeight(DEFAULT_SERVING_SIZE)
              .build();
      img = imagesService.processTransform(img, resizeXform, unusedStatus);
    }

    MIME_TYPE outputMimeType = MIME_TYPE.JPEG;
    String outputMimeTypeString = "image/jpeg";
    if (transcodeToPng.contains(originalMimeType)) {
      outputMimeType = MIME_TYPE.PNG;
      outputMimeTypeString = "image/png";
    }
    return new Image(
        imagesService.saveImage(img, outputMimeType, unusedStatus), outputMimeTypeString);
  }
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -



