ysugimoto / aws-lambda-image

Automatic image resize/reduce on AWS Lambda
MIT License
823 stars 220 forks source link

Unable to resize images above 50kb #27

Open amita-trantor opened 8 years ago

amita-trantor commented 8 years ago

I get the following error when I resize image having size greater than 50kb(Around 500KB) I get the following error on Lambda(Although it runs fine on my local) :-

{
  "errorMessage": "Woops, image process failed: ImageMagick errError: Command failed: convert: Expected 8192 bytes; found 6062 bytes `-' @ warning/png.c/MagickPNGWarningHandler/1777.\nconvert: Read Exception `-' @ error/png.c/MagickPNGErrorHandler/1751.\nconvert: corrupt image `-' @ error/png.c/ReadPNGImage/3789.\nconvert: no images defined `png:-' @ error/convert.c/ConvertImageCommand/3046.\n"
}

Too much confused I am.

leonfancy commented 8 years ago

I think this is caused by an unexpected image name, maybe the image file name contains some characters such as "-" which cannot be handled.

amita-trantor commented 8 years ago

@SlimFancy Tried with 0.png, test.png also. It still shows me the same issue.

amita-trantor commented 8 years ago

In case I try to use /tmp/ to store image and use srcPath instead of srcData(mentioned below) I get the following error :-

{
  "errorMessage": "Woops, image process failed: ImageMagick errError: Command failed: convert: improper image header `/tmp/testingfile1.png' @ error/png.c/ReadPNGImage/3741.\nconvert: no images defined `png:-' @ error/convert.c/ConvertImageCommand/3046.\n"
}

modified ImageResizer.js is as follows :-

var ImageData   = require("./ImageData");

var Promise     = require("es6-promise").Promise;
var ImageMagick = require("imagemagick");
var fs = require('fs');
var aws     = require("aws-sdk");
var client  = new aws.S3({apiVersion: "2006-03-01"});
/**

/**
 * Image Resizer
 * resize image with ImageMagick
 *
 * @constructor
 * @param Number width
 */
function ImageResizer(options) {
    this.options = options;
}

/**
 * Execute resize
 *
 * @public
 * @param ImageData image
 * @return Promise
 */
ImageResizer.prototype.exec = function ImageResizer_exec(image) {
    var imagetype = image.getType();

    var params = {Bucket: image.bucketName, Key:  image.fileName};
    var file = fs.createWriteStream('/tmp/testingfile1.png');
      client.getObject(params).createReadStream().pipe(file);
    var params = {
        // srcData:   image.getData().toString("binary"),
        srcPath: '/tmp/testingfile1.png',
        srcFormat: imagetype,
        format:    imagetype
    };

    var acl = this.options.acl;

    if(this.options.size){
        params['width'] = this.options.size;
    }
    else {
        if(this.options.width){
            params['width'] = this.options.width;
        }
        if(this.options.height){
            params['height'] = this.options.height;
        }
    }

    return new Promise(function(resolve, reject) {
        ImageMagick.resize(params, function(err, stdout, stderr) {
            if ( err || stderr ) {
                reject("ImageMagick err" + (err || stderr));
            } else {
                resolve(new ImageData(
                    image.fileName,
                    image.bucketName,
                    stdout,
                    image.getHeaders(),
                    acl
                ));
            }
        });
    });
};

module.exports = ImageResizer;
ysugimoto commented 8 years ago
var file = fs.createWriteStream('/tmp/testingfile1.png');

is

 fs.writeFileSync(
    '/tmp/testingfile1.png',
    image.getData().toString("binary"),
    {encoding: 'binary'}
);

isn't it? and causes same error? I just merged PR https://github.com/ysugimoto/aws-lambda-image/pull/28, This is escape filename, please try it.

ysugimoto commented 8 years ago

@amita-trantor I had problem on dependency library, and updated to 0.8.0. Please update package or re-install this, try it.