Amazon S3动画gif - 仅上传第一帧

时间:2017-04-26 07:34:51

标签: c# amazon-web-services amazon-s3 animated-gif

(我已经在Stackoverflow上研究了我可以找到的所有类似问题,但没有一个能帮助我解决我的问题)

我可以像这样上传一个gif到Amazon S3,其中request.FileBytes是一个字节数组:

public bool UploadFile(CdnFile request)
{
  var transfer = new TransferUtility(CdnConfig.AccessKey, CdnConfig.SecretKey, ep);
  var uploadRequest = new TransferUtilityUploadRequest();
  uploadRequest.InputStream = new MemoryStream(request.FileBytes);

  var result = transfer.BeginUpload(s3Req2, cb, null);
  transfer.EndUpload(result);
}

这适用于.jpg,但对于动画.gif,只上传了gif的第一帧(如果我直接通过S3上传相同的gif,它可以正常工作)。所以它必须与我如何流式传输或转换文件有关,但我不知道如何找出问题发生的位置。

我按如下方式创建request.FileBytes,其中' imageData'是图像的原始数据(Chrome在显示我尝试上传到S3的动画gif预览时会使用此图像数据,并且动画很好):

var data = Convert.FromBase64String(imageData);
var img = new Bitmap(new MemoryStream(data));
fileBytes = img.SaveAsGif();

public static byte[] SaveAsGif(this Image img, long quality = 100)
{
    ImageCodecInfo gifEncoder = GetEncoder(ImageFormat.Gif);

    Encoder myEncoder = Encoder.Quality;

    EncoderParameters myEncoderParameters = new EncoderParameters(1);

    EncoderParameter myEncoderParameter = new EncoderParameter(myEncoder, quality);
    myEncoderParameters.Param[0] = myEncoderParameter;

    using (MemoryStream msGif = new MemoryStream())
    {
        img.Save(msGif, gifEncoder, myEncoderParameters);
        return msGif.ToArray();
    }
}

2 个答案:

答案 0 :(得分:1)

这段代码对我来说很好,也许你可以根据你的用例进行调整。我从本地文件上传了一个GIF,上传后显示/工作正常:

        using (var client = new AmazonS3Client("AKIAI5ZL44fake4442COJA", "4sYnPuA1zMkhghghghghTpX4F5/FUXGDiAKm", RegionEndpoint.USEast1))
        {
            var request = new PutObjectRequest
            {
                BucketName = "bucketname",
                ContentType = "image/gif",
                Key = "test.gif",
                FilePath = @"c:\dev\006.gif"
            };
            var response = client.PutObject(request);
        }

答案 1 :(得分:0)

我的SaveAsGif方法是问题所在,因此问题与编解码器有关。我可以创建我的request.fileBytes而不使用像这样的编解码器,它可以工作:

var imageStream = new MemoryStream(data);
fileBytes = imageStream.ToArray();