【问题标题】:How to get the size (in pixels) of a jpeg image I get with UrlFetchApp.fetch(photoLink)?如何获取我使用 UrlFetchApp.fetch(photoLink) 获得的 jpeg 图像的大小(以像素为单位)?
【发布时间】:2013-10-08 20:04:41
【问题描述】:

在以 HTML 格式发送电子邮件的脚本中,我添加了一个存储在公共共享文件夹中的图像。 我使用UrlFetchApp.fetch(photoLink) 获得了blob,但图像的大小不一定正确,因此在html代码中我使用宽度和高度属性(现在使用固定值,请参见下面的代码)但我希望它自动调整大小正确的比例。

为了实现这一点,我需要知道如何获取图像的原始大小(高度和宽度),但我只是不知道如何在不将图像插入中间文档的情况下获取它(这可行,但我发现这种方法有点奇怪和不必要的复杂......而且我不觉得每次更改图像文件时都会出现无用的文档)。

这是创建电子邮件的代码的相关部分:

function sendMail(test,rowData,genTitle,day,title,stHour,endHour){
  var photoLink = sh.getRange('H1').getValue();
  var image = UrlFetchApp.fetch(photoLink);
  //************* find the pixel size of the image to get its ratio
  var msgTemplate = '<A HREF="http://www.domain.be/reservations-global/"><IMG SRC="'+photoLink+'" BORDER=0 ALT="logo" HEIGHT=200 WIDTH=300></A><BR><BR>'+
    'Résumé de vos réservations au nom de <NOM><BR><BR><BR><table style="background-color:lightblue;border-collapse:collapse;" border = 1 cellpadding = 5><th></th><th><TABLEHEADER></th><EVENTS></table><BR><CONCLUSION><BR>Cordialement,<BR><BR>';
  var mailTitle = 'Confirmation de réservation - '+getTextFromHtml(genTitle);
  var descr = '';
  for(var d = 0;d<day.length;++d){
    Logger.log(Number(rowData[(d+5)]));
    var content = '<tr bgcolor="#ffffbb" width="100%"><td><NUMBER> </td><td > <DESCRIPTION></td></tr>'
    if(Number(rowData[(d+5)])>1){var pl = ' places'}else{var pl = ' place'};
    content = content.replace('<NUMBER>',rowData[(d+5)]+pl);
    content = content.replace('<DESCRIPTION>',title[d]+' de '+stHour[d]+' heures à '+endHour[d]+' heures');
    if(Number(rowData[(d+5)])>0){
      descr += content;
    }
  }
  msgTemplate = msgTemplate.replace('<NOM>',rowData[1]).replace('<EVENTS>',descr).replace('<TABLEHEADER>',genTitle); 
  var textVersion = getTextFromHtml(msgTemplate.replace(/<br>/gi,'\n').replace(/<td>/gi,'\n'));
//  Logger.log(textVersion)
  if(test){
    MailApp.sendEmail(Session.getEffectiveUser().getEmail(),mailTitle, textVersion,{'htmlBody':msgTemplate,"replyTo" : retour});
  }
  else
  {
    MailApp.sendEmail(rowData[2],mailTitle, textVersion,{'htmlBody':msgTemplate,"replyTo" : retour});
  }
}

【问题讨论】:

    标签: google-apps-script


    【解决方案1】:

    在 Apps 脚本中没有简单的方法来确定图像的大小。还有一些其他项目可能能够分析位图数据并为您提供尺寸。

    上次我不得不解决这个问题。我刚刚编写了一个简单的 App Engine 应用来为我进行图像数学运算 -

    import webapp2
    from google.appengine.api import urlfetch
    from google.appengine.api import images
    from django.utils import simplejson
    
    class MainHandler(webapp2.RequestHandler):
      def get(self):
        url = self.request.get('url')
        imgResp = urlfetch.fetch(url) #eg. querystring - url=http://xyz.com/img.jpg 
        if imgResp.status_code == 200:
          img = images.Image(imgResp.content);
          jsonResp = {"url":url, "h":img.height, "w":img.width, "format":img.format}
          self.response.headers['Content-Type'] = 'application/json'
          self.response.out.write(simplejson.dumps(jsonResp))
    
    app = webapp2.WSGIApplication([('/imageinfo', MainHandler)], debug=True)
    

    然后我像这样从 Apps 脚本中调用它 -

    function checkImageSizes() {
      var imageUrls = ['http://developers.google.com/apps-script/images/carousel0.png','http://www.w3.org/MarkUp/Test/xhtml-print/20050519/tests/jpeg420exif.jpg'];
      for(var i in imageUrls){
        var resp = JSON.parse(UrlFetchApp.fetch('http://arunimageinfo.appspot.com/imageinfo?url='+imageUrls[i]).getContentText());
        Logger.log('Image at %s is %s x %s',resp.url,resp.w,resp.h);
      }  
    }
    

    如果您的量是每周几次,欢迎您使用我的 App Engine 实例 :)

    【讨论】:

    • 嗨阿伦,谢谢。我的数量很可能是每月一到两次;-) 所以我很乐意使用它。就是说,您的代码在我头顶高飞……我将不得不尝试进入它并希望了解它是如何工作的。如果我失败了,我可能会回到你身边(如果你不介意的话)。干杯,塞尔吉
    • App Engine 部分会进行一些简单的图像高度/宽度计算,并将该值作为 JSON 返回,以便 Apps 脚本可以使用它。祝你好运!
    • 嗨,阿伦,小问题:我刚刚注意到此代码不适用于名称中包含空格的图像...,这正常吗?不是什么大问题,因为我当然可以重命名它,但我很好奇 :-) 示例:dl.dropboxusercontent.com/u/211279/photo%20sylvette.jpg
    • 是的,可能是一个错误:)
    【解决方案2】:

    我怀疑您可以在应用程序脚本中执行此操作。当然不是本地的,但您可能能够找到或改编一个 jpg 库,该库查看二进制 blob 标头并提取图像大小。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多