返回列表 发帖

《整合struts,hibernate,spring应用开发详解》中的问题

   
  在《整合struts,hibernate,spring整合应用开发详解》的第11章中,对于
AddPhotoAction 中使用upload工具类中的问题

对于如下代码

  1.    
  2. //创建一个上传相片的工具类
  3.    Upload upload = new Upload();
  4.    //执行上传文件
  5.    upload.upload(file, clientPath, suffix);   
  6.    //使用工具类生成一个小图
  7.    upload.makeImage(upload.getUrl(), 140, -20, upload.makeNewUrl(clientPath, suffix, "_small"), suffix.substring(1));  
  8.    //使用工具类生成一个大图
  9.    upload.makeImage(upload.getUrl(), 600, -20, upload.makeNewUrl(clientPath, suffix, "_big"), suffix.substring(1));   cs.addPhoto(name, desc, 0, upload.makeNewUrl(path, suffix, ""), upload.makeNewUrl(path, suffix, "_big"),
  10.      
  11.    upload.makeNewUrl(path, suffix, "_small"), DateUtil.getFormalTime(), false, albumId);
复制代码


第一个问题
对于调用makeImage方法,为什么设置新的图片度度,都要设置负数-20? 不是正数? 生成大图和小图,生成的新高度都取同一个值-20呢?


第二个问题
在upload.java类中对于makeImage()方法(Upload.java代码见最后面附上)
为什么高比宽大,就非要交换?交换了为什么就会是生成的图片的长和宽都在一个范围内呢?不太明白这句话的描述意识?

  1.   //读取图片
  2.   BufferedImage bi = ImageIO.read(new File(url));
  3.   //判断读入图片的宽和高
  4.   if (bi.getHeight() > bi.getWidth())
  5.   {
  6.    //如果高比宽大,就交换两值,确保生成的图片的长和宽都在一个范围内
  7.    int tmp = newWidth;
  8.    newWidth = newHeight;
  9.    newHeight = tmp;
  10.   }
复制代码


第三个问题
在upload.java类中对于makeImage()方法(Upload.java代码见最后面附上)
对于如下代码

  1.   //以新的高和宽构造一个新的缓存图片
  2.   BufferedImage bi3 = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
  3.   Graphics g = bi3.getGraphics();
  4.   
  5.   //在新的缓存图片中画图
  6.   g.drawImage(image2, 0, 0, null);
复制代码


新的缓存图片中画图 ,已经构造了一个新的缓存图片,为什么还要在新的缓存图片中画图呢?

  1. public class Upload
  2. {
  3. private String url;
  4. private String fileName;

  5. /** 上传文件方法
  6.    * @param FormFile file, 选定文件的实体
  7.    * @param request HttpServletRequest
  8.    * @param userName 用户的名称,String型
  9.    * @param webPath 服务器的绝对路径
  10.    * @param suffix 传入文件的后缀
  11.    */
  12. public void upload(FormFile file, String path, String suffix)
  13.   throws Exception
  14. {
  15.   
  16.   //获取文件的大小
  17.   //这里获取文件的大小,说得很不准确,应该说获取文件中的具体内容才对
  18.   byte[] content = file.getFileData();
  19.   //以时间格式生成文件名
  20.   String url = makeUrl(path, suffix);
  21.   
  22.   //此处url是得到完整的文件路径
  23.   this.url = url;
  24.   //用输出流保存文件(输出流保存的文件应该是保存到硬盘上了found by heyitang 200811070923)
  25.   FileOutputStream fos = new FileOutputStream(url);
  26.   //写入时间
  27.   fos.write(content);
  28.   //关闭输出流
  29.   fos.close();
  30. }
  31. //如下方法是得到原始的文件
  32. private String makeUrl(String path, String suffix)
  33. {
  34.   this.fileName = DateUtil.getStringTime();
  35.   return path + "\\" + this.fileName + suffix;
  36. }
  37.   //如下方法是得到缩小和放大的图片文件
  38. public String makeNewUrl(String path, String suffix, String other)
  39. {
  40.   return path + "\\" + this.fileName + other + suffix;
  41. }
  42. /** 返回上传后文件的绝对URL
  43.    * @return String
  44.    */
  45. public String getUrl()
  46. {
  47.   return this.url;
  48. }
  49. public String getFileName()
  50. {
  51.   return this.fileName;
  52. }
  53. /** 用于生成上传完后的图片的副本
  54.    * @param url 原图的绝对URL
  55.    * @param newWidth 生成副本的新宽度
  56.    * @param newHeight 生成副本的新高度
  57.    * @param newUrl 生成副本的地址
  58.    * @param formatName 生成图片的格式
  59.    */
  60. public void makeImage(String url, int newWidth, int newHeight, String newUrl, String formatName)
  61.   throws Exception
  62. {
  63.   //读取图片
  64.   BufferedImage bi = ImageIO.read(new File(url));
  65.   //判断读入图片的宽和高
  66.   if (bi.getHeight() > bi.getWidth())
  67.   {
  68.    //如果高比宽大,就交换两值,确保生成的图片的长和宽都在一个范围内
  69.    int tmp = newWidth;
  70.    newWidth = newHeight;
  71.    newHeight = tmp;
  72.   }
  73.   //用Image里的方法对图片进行等比压缩,只要宽和高其一值为负,则以正的那个值为最大边进行等比压缩
  74.   Image image2 = bi.getScaledInstance(newWidth, newHeight, Image.SCALE_AREA_AVERAGING);
  75.   
  76.   //获取压缩后图片的高和宽
  77.   int height = image2.getHeight(null);
  78.   int width = image2.getWidth(null);   
  79.   
  80.   //FileOutputStream fos = new FileOutputStream(new File(newUrl));
  81.   
  82.   //以新的高和宽构造一个新的缓存图片
  83.   BufferedImage bi3 = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
  84.   Graphics g = bi3.getGraphics();
  85.   
  86.   //在新的缓存图片中画图
  87.   g.drawImage(image2, 0, 0, null);
  88.   
  89.   //构造IO流输出到文件
  90.   FileOutputStream fos = new FileOutputStream(new File(newUrl));
  91.   ImageIO.write(bi3, formatName, fos);
  92.   fos.close();
  93. }
  94. /** 该方法是删除图片
  95.    * @param url 删除图片的绝对地址
  96.    * @param bigUrl 数据库中大图片的URL
  97.    * @param smallUrl 数据库小图片的URL
  98.    * @param realPath 服务器中的绝对路径
  99.    */
  100. public void deleteImage(String url, String bigUrl, String smallUrl, String realPath)
  101. {
  102.   //构造三个文件对象,调用方法把所有对应的图片删除
  103.   File fUrl = new File(realPath + "/" + url);
  104.   File fBigUrl = new File(realPath + "/" + bigUrl);
  105.   File fSmallUrl = new File(realPath + "/" + smallUrl);
  106.   fUrl.delete();
  107.   fBigUrl.delete();
  108.   fSmallUrl.delete();
  109. }
  110. }

复制代码

提问赏金:3金币
获奖名单 : boxiong(1金币)    kongyeeku(2金币)    
倚楼听风雨,笑看江湖路。。。

第一和第二个问题, 应该是等比压缩吧, 确保不破坏图片原来的比例, 使用图片显示出来好看些

TOP

原帖由 boxiong 于 2008-11-7 10:40 发表
第一和第二个问题, 应该是等比压缩吧, 确保不破坏图片原来的比例, 使用图片显示出来好看些


谢谢楼主的热心回复!不过,你还没有具体的回答我的这三个问题!也许,作为作者,李老师应该会更清楚他的处理意图,期待李老师能回复一下!
倚楼听风雨,笑看江湖路。。。

TOP

原帖由 heyitang 于 2008-11-7 13:21 发表


谢谢楼上的热心回复!不过,你还没有具体的回答我的这三个问题!也许,作为作者,李老师应该会更清楚他的处理意图,期待李老师能回复一下! ...


你还没搞懂BufferedImage,它创建的只是一个空图,没有任何东西。当然需要重新绘制啊。
楼主不是已经买了《疯狂Java讲义》吗?建议阅读《疯狂Java讲义》的11.8节。
并参看配套光盘下codes/11/11-8/ZoomImage.java,这是一个缩放位图的程序.
看完自然就懂了。
生命没有假期!
如果生命只剩下最后一秒,你可会想到我?

TOP

TOP

原帖由 heyitang 于 2008-11-7 13:21 发表


谢谢楼主的热心回复!不过,你还没有具体的回答我的这三个问题!也许,作为作者,李老师应该会更清楚他的处理意图,期待李老师能回复一下! ...

ok,这两天在看“反射”,还没从头看呢!
倚楼听风雨,笑看江湖路。。。

TOP

原帖由 boxiong 于 2008-11-7 13:34 发表
结帖结帖, PS: 楼主今天和昨天的帖子, 都是3个金币的, 下次多点啊, 赚钱难啊


经济不紧气,金币得省着点用才行!
倚楼听风雨,笑看江湖路。。。

TOP

TOP

TOP

返回列表