如何让列表的产品图片进行多线程压缩(缩略图)并显示。
问题描述:
1、产品后台管理系统部署在A6服务器上,客户在这对服务器上通过后台管理系统进行对产品的维护。
1.1、产品维护时,上传产品图片时控制在200K内,却没有做缩略图。
2、产品质量查询系统部署在A3服务器上,供互联网用户进行查询产品信息。
2.1、当互联网通过产品质量信息查询系统查询产品列表时,显示产品列表(产品主图,产品名称等信息)时,显示图片很慢,图片显示格式
<img src="A6服务器IP+图片名称(1.jpg)" width="75" height="90"/>
,所以在显示时只改变了图片的width,height,而没有改变图片本身的质量,所以很慢。
问题解决方案:
1、为了弥补产品主图的缩略图问题,我们在显示的时候把http图片进行压缩(做成缩略图)传输,然后显示,这样比之前显示快很多!原有的图片有80K,现在经过压缩显示为30K。
2、图片大小问题解决了,但是图片显示还是慢了点,不理想,后来发现图片显示是一个接着一个显示的,也就是说处理图片压缩的类只能一个一个进行压缩,一个压缩完了才压缩第二个。
3、这时我想到了多线程处理方式,让多线程类创建五个线程同时进行压缩并显示,问题就出现在这里,发现我的多线程不是自己想像的那样进行处理的,但不知道问题出现在哪里?希望各位帮找找原因。
期望效果:一打开产品列表,图片压缩同时对6张图片进行压缩并显示
原代码如下:
1、图片压缩类
package me.jwinder.test;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import com.sun.image.codec.jpeg.ImageFormatException;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageDecoder;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
/**
* File :<b>ImageCompress.java</b><br/>
* Time :2009-8-13 上午10:03:55 <br />
* Note :remark...<br />
* @author HF-JWinder
* @version 1.0
*/
public class ImagesUtil
{
public ImagesUtil() {}
private static ImagesUtil instance ;
public static ImagesUtil getInstance()
{
if(null == instance)
{
instance = new ImagesUtil();
}
return instance ;
}
/**
* Method:图片缩小,包括图片尺寸缩小和图片像素(质量)减小<br>
* Remark:一般在客户端显示大图片,比如产品列表的产品主图片<br>
* Author:HF-JWinder(2009-8-13 下午01:39:54)
* @param in InputStream
* @param out OutputStream
* @param width 宽
* @param height 高
*/
private void zoomout(InputStream in, OutputStream out, int width, int height)
{
try {
JPEGImageDecoder decoderFile = JPEGCodec.createJPEGDecoder(in);
BufferedImage imageFile = decoderFile.decodeAsBufferedImage();
// 获得目标图片的宽高,同时乘以放缩比例得到新图片大小
int w = width;
int h = height;
// 建立一个新图片的缓存图片
BufferedImage bufImage = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
// 从目标图片上获得Graphics以便画在新图片上,最后一个参数是内部无名类,可以用null代替
Graphics g = bufImage.getGraphics();
g.drawImage(imageFile, 0, 0, w, h, null
/*
new ImageObserver() {
public boolean imageUpdate(Image img, int infoflags, int x, int y, int width, int height)
{
return true;
}
} */
);
// 编码输出
JPEGImageEncoder jpeg = JPEGCodec.createJPEGEncoder(out);
jpeg.encode(bufImage);
out.flush();
}
catch (ImageFormatException e)
{
e.printStackTrace();
// TODO: handle exception
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
out.close();
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/**
* 网络缩略图[大小和质量],URL图片进行缩略,服务器进行处理然后显示。
* 图片服务器和显示图片服务器和客户端之间交互显示,对原有图片进行缩放,包括大小和质量。
* @param in 读入图片流
* @param out 写出流
* @throws ImageFormatException
* @throws IOException
*/
public void netZoomout(OutputStream out, String imgURL, int width, int height) throws ImageFormatException, IOException
{
int HttpResult; // 服务器返回的状态
URL url = new URL(imgURL); // 创建URL
URLConnection urlconn = url.openConnection(); // 试图连接并取得返回状态码
urlconn.connect();
HttpURLConnection httpconn =(HttpURLConnection) urlconn;
//通过HTTP连接图片地址
HttpResult = httpconn.getResponseCode();
if(HttpResult != HttpURLConnection.HTTP_OK) // 不等于HTTP_OK说明连接不成功
{
return ;
}
InputStream in = urlconn.getInputStream();
this.zoomout(in, out, width, height);
}
/**
* Method:服务器本地图片压缩<br>
* Remark:...<br>
* Author:HF-JWinder(2009-8-13 下午02:45:13)
* @param out
* @param imgFile
* @param width
* @param height
* @throws FileNotFoundException
*/
public void nativeZoomout(OutputStream out , String imgFile, int width, int height) throws FileNotFoundException
{
File file = new File(imgFile);
InputStream in = new FileInputStream(file);
this.zoomout(in, out, width, height);
}
}
2、图片多线程类
package me.jwinder.test;
import java.io.IOException;
import java.io.OutputStream;
import com.sun.image.codec.jpeg.ImageFormatException;
/**
* File :<b>ImagesUtilThread.java</b><br/>
* Time :2009-8-13 下午03:17:51 <br />
* Note :remark...<br />
* @author HF-JWinder
* @version 1.0
*/
public class ImagesUtilThread extends Thread {
private String url ;
private OutputStream out ;
public ImagesUtilThread(String url, OutputStream out)
{
System.out.println("Thread:" + url);
this.url = url;
this.out = out;
}
public void run()
{
try {
new ImagesUtil().netZoomout(out, url, 75, 90);
} catch (ImageFormatException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
3、图片Servlet类
package me.jwinder.test;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* File :<b>ImagesServlet.java</b><br/>
* Time :2009-8-13 上午10:32:11 <br />
* Note :remark...<br />
* @author HF-JWinder
* @version 1.0
*/
public class ImagesServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires", 0);
String url = request.getParameter("url");
System.out.println(url);
//new ImagesUtil().netZoomout(response.getOutputStream(), url, 75, 90);
new ImagesUtilThread(url, response.getOutputStream()).start();
}
}
4、JSP产品列表页面MyJsp.jsp
<body>
1.
<img src="servlet/ImagesServlet?url=http://211.100.42.6/fireWeb/upload/2006/10/31/20090413072339667107.jpg" border="1"/>
2.
<img src="servlet/ImagesServlet?url=http://211.100.42.6/fireWeb/upload/2005/11/28/200904130723433004190.jpg" border="1"/>
3.
<img src="servlet/ImagesServlet?url=http://211.100.42.6/fireWeb/upload/2006/06/05/20090413072347785922.jpg" border="1"/>
4.
<img src="servlet/ImagesServlet?url=http://211.100.42.6/fireWeb/upload/2001/10/31/200904130723589419479.jpg" border="1"/>
5.
<img src="servlet/ImagesServlet?url=http://211.100.42.6/fireWeb/upload/2001/02/21/200904130724043328489.jpg" border="1"/>
6.
<img src="servlet/ImagesServlet?url=http://211.100.42.6/fireWeb/upload/1997/08/28/200904130723535664934.jpg" border="1"/><br/>
</body>
</html>
分享到:
相关推荐
本文将详细讲解如何使用C#语言在.NET环境下实现图片的压缩和缩略图的生成。 首先,我们需要引入必要的命名空间,如`System.Drawing`,它包含了处理图像所需的类: ```csharp using System.Drawing; using System....
用户只需运行此程序,并按照界面提示选择输入图片目录、输出目录、缩略图尺寸和模式,即可自动处理指定的图片文件。 综上所述,批量生成静态缩略图或gif动画缩略图涉及的技术包括图像处理、文件格式理解、多线程...
在这个特定的场景中,我们关注的是如何使用Silverlight来生成缩略图并进行图片压缩。这通常涉及到对原始图片进行大小调整,以减少其在内存中的占用和在网络上传输时的数据量。 `WriteableBitmap`是Silverlight中...
在实际应用中,可能还需要考虑性能优化、多线程处理大量图片、错误处理等因素。对于更高级的功能,如自定义压缩算法或特殊效果,可以利用第三方库如ImageSharp,它提供了丰富的API用于图像处理,包括无损压缩和剪切...
比如,可以使用缓存来避免重复生成同一图像的缩略图,或者使用多线程来并发处理不同的图片。 至于压缩包子文件的文件名称列表中提到的[Content_Types].xml、_rels、drs,这些看起来像是与ZIP归档文件相关的文件。在...
网页缩略图生成技术是一种常见的Web开发功能,它允许用户通过输入网址、设定目标宽度和高度,快速获取网站页面的预览图片。这种技术在许多应用场景中非常实用,例如社交媒体分享、搜索引擎结果展示、网站目录索引等...
3. 多线程处理:如果需要批量生成缩略图,可以考虑使用线程池或异步任务来并发处理,提高效率。 4. 使用LruCache:Android提供的一种内存管理机制,用于限制内存中的Bitmap数量,防止因内存泄漏导致应用崩溃。 总结...
综上所述,C#中的图像处理涵盖了从基本的读取、绘制到复杂的缩略图生成和水印添加等多个方面,开发者可以根据需求灵活选择合适的工具和技术进行操作。在实际项目中,应结合性能、可扩展性和版权等因素综合考虑。
6. **优化性能**:对于大量图片的缩略图生成,可以考虑使用多线程或异步处理,以提高程序运行效率。 在实际开发中,"continued9l2"可能代表了这个项目是一个连续开发或升级的版本,意味着在前一个版本的基础上进行...
在实际开发中,我们还需要考虑性能优化,比如只在需要时生成缩略图,使用缓存机制避免重复计算,以及利用多线程处理大图片等。此外,为了适应不同分辨率的屏幕,可能需要动态调整缩略图的大小和质量。 总结起来,...
在Java中生成缩略图是一项常见的任务,尤其...在实际应用中,可能还需要考虑性能优化,比如使用多线程处理大量图片,或者使用专门的图像处理库,如Apache Commons Imaging(前身为Sanselan)或ImageMagick的Java绑定。
Java实现批量压缩图片裁剪压缩多种尺寸缩略图一键批量上传图片需要结合多种技术和框架,例如IO流操作、Base64编码、多线程编程、数据库操作、分布式文件服务器和前端技术等,来实现批量压缩图片裁剪压缩多种尺寸缩略...
在Asp.net开发中,生成图片的缩略图是一项常见的需求,这主要应用于网站的相册、产品展示或任何需要预览图片的场景。本文将详细介绍如何在Asp.net环境中实现图片的缩略图生成。 首先,我们需要了解缩略图生成的基本...
有损压缩则会牺牲部分质量来换取更高的压缩比,如JPEG格式,它利用人类视觉系统的特性,对图像进行离散余弦变换(DCT)并丢弃高频信息。 2. 常见的图片压缩算法: - JPEG:使用DCT,适用于照片和其他连续色调的...
本篇文章将详细探讨如何使用C#来生成图片缩略图,并涉及相关的知识点。 首先,我们需要了解C#中的`System.Drawing`命名空间,它是处理图像处理的核心工具集。在这个命名空间下,`Bitmap`类用于表示图像对象,而`...
在Asp.net开发中,处理图片上传、添加水印以及生成缩略图是常见的需求,尤其是在构建内容管理系统、电子商务网站或者社交媒体平台时。本压缩包提供的"超强图片上传类(上传+水印+缩略图)"是针对这些需求的一个解决...
此外,如果处理大量图像,可以考虑使用多线程或者异步操作来提升效率。 总结来说,C#提供了一套完整的API来处理图像和生成缩略图。通过巧妙地使用Bitmap、Graphics和DrawImage方法,开发者可以在应用程序中轻松实现...
本篇文章将深入探讨如何使用C#进行无损高质量的图片压缩以及生成高质量的缩略图。 首先,我们需要理解图片压缩的基本原理。图片压缩主要有两种类型:有损压缩和无损压缩。有损压缩会丢失部分数据,通常用于减小文件...
- 然后,调用GetThumbnailImage方法生成缩略图,并将其保存到新的文件中,或者直接显示在用户界面上。 - 编程时需要注意处理可能出现的异常,比如文件不存在、内存不足等问题。 5. **文件I/O操作**: - C#提供了...
在Web应用中,缩略图可以用于图片库、产品展示等场景。 1. **基本概念与原理**: - 图像处理库:在C#中,常用的是`System.Drawing`命名空间,它包含了一系列处理图像的类,如`Image`、`Bitmap`、`Graphics`等。 -...