先前在做项目时也对图片做过处理,只是后来换了应用服务器平台之后发现不少问题,于是进行深入学习,摸索出了这么些东西。
1.图片存储
在图片的存储字段方面,SQL Server和My SQL都有相应的字段,而在Oracle里没有明确的字段,但也提供了几个大型字段,一般,我们存储在BLOB类型里。这里有个CLOB和BLOB字段的讨论,网上学习之后知道,BLOB存储的是二进制流,而CLOB存储的是大容量的字符串,当然就应该由BLOB来承担重任了。
2.读取
BLOB的读取也是一麻烦事,在不同平台上的读取不就不一样,这个在我上一文中有说。
3.生成图片
这是想写的重点。上次有朋友在群里问过,图片生成质量不好,其实图片的生成有好多种方法。下面一一给出代码
(1)最复杂但生成图片质量较好的方法
BLOB blob =(BLOB)rs.getObject("fimage"); //这是在Tomcat环境下取BLOB的值
//Blob blob=rs.getBlob("fimage"); // 这是在weblogic环境下取BLOB的值
InputStream in=blob.getBinaryStream(); //生成输入流
BufferedImage bimage = null; // 缓存图片对象
BufferedInputStream ins = new BufferedInputStream(in); //生成缓存输入流
bimage=ImageIO.read(ins); //由ImageIO对象读成缓存图片对象。ImageIO是个很重要的对象
ServletOutputStream sos = response.getOutputStream(); //取得输出流,这里是把图片输出到客户端,如果想把图片生成本地图片文件可以这样
//FileOutputStream sos=new FileOutputStream(new File("C:/cs.jpg"));
BufferedOutputStream bos = new BufferedOutputStream(sos); //生成输出缓存
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(bos); //生成JPEG图片对象
encoder.encode(bimage); //按格式把图片流进行编码
bos.close();
sos.close();
这种图片生成方式麻烦一些,在页面还要做个引用或者把这段代码直接写在页面上
(2)直接ImageIO对象写出来
BLOB blob =(BLOB)rs.getObject("fimage");
//Blob blob=rs.getBlob("fimage");
InputStream in=blob.getBinaryStream();
BufferedImage bimage = null;
BufferedInputStream ins = new BufferedInputStream(in);
bimage=ImageIO.read(ins);
ImageIO.write(bimage,"JPEG",response.getOutputStream()); //主要的是这句,直接就把图片画出来了,但图片质量并不太好,一般在做网页识别码时用,第二个参数可以设置图片的类型,第三个参数为输出对象,这里也可以换成在本地生成图片文件,只需把文件流改写成new FileOutputStream(new File("C:/cs.jpg"))
(3)以文件流读写的方式直接输出
BLOB blob =(BLOB)rs.getObject("fimage");
//Blob blob=rs.getBlob("fimage");
InputStream in=blob.getBinaryStream();
response.setContentType("image/jpeg");
BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream());
int n;
while ((n=in.read())!=-1){
bos.write(n);
}
bos.flush();
bos.close();
in.close();
这种方式没有进行过多探讨,但这种方式输出是成功的,我个人觉得似乎有些别扭,所以不用
还有中方式,在做web图片输出的时候可以用response.write()的方式写出,但具体怎样我也不太清楚,是同事告诉可以行得通的一种方式。
4.图片的操作
先前我有些图片从网上宕下来是倒置的,入库前想正过来,因为先前的项目设计没想到这些,为了不增加额外工作,于是想找方法把倒置图片正过来,有两种方法
(1)在网页上输出时用css做处理
<img src="1483013.jpg" style="FILTER: FlipV(color=silver)">
(2)用程序把图片正过来
在网上搜了半天,终于搜到一个高手写的三个操作图片的方法,试了试,很不错,有些地方进行了修改,很可惜忘记了这个高手的出处,在此感谢一下,借用。
public static BufferedImage resizeImage(final BufferedImage bufferedimage,
final int w, final int h,final boolean flg){
int type = bufferedimage.getColorModel().getTransparency();
BufferedImage img;
Graphics2D graphics2d;
if(flg){
int wg = bufferedimage.getWidth();
int hg = bufferedimage.getHeight();
if(wg>w||hg>h){
(graphics2d = (img = new BufferedImage(w, h, type)).createGraphics())
.setRenderingHint(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BILINEAR);
graphics2d.drawImage(bufferedimage,0,0,w,h, null);
}else{
(graphics2d = (img = new BufferedImage(wg, hg, type)).createGraphics())
.setRenderingHint(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BILINEAR);
graphics2d.drawImage(bufferedimage,0,0,wg,hg,null);
}
}else{
(graphics2d = (img = new BufferedImage(w, h, type)).createGraphics())
.setRenderingHint(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BILINEAR);
graphics2d.drawImage(bufferedimage,0,0,w,h, null);
}
graphics2d.dispose();
return img;
}
public static BufferedImage rotateImage(final BufferedImage bufferedimage,final int degree){
int w = bufferedimage.getWidth();
int h = bufferedimage.getHeight();
int type = bufferedimage.getColorModel().getTransparency();
BufferedImage img;
Graphics2D graphics2d;
(graphics2d = (img = new BufferedImage(w, h, type))
.createGraphics()).setRenderingHint(
RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BILINEAR);
graphics2d.rotate(Math.toRadians(degree), w / 2, h / 2);
graphics2d.drawImage(bufferedimage, 0, 0, null);
graphics2d.dispose();
return img;
}
public static BufferedImage flipImage(final BufferedImage bufferedimage){
int w = bufferedimage.getWidth();
int h = bufferedimage.getHeight();
BufferedImage img;
Graphics2D graphics2d;
(graphics2d = (img = new BufferedImage(w, h, bufferedimage.
getColorModel().getTransparency())).createGraphics())
.drawImage(bufferedimage, 0, 0, w, h, w, 0, 0, h, null);
graphics2d.dispose();
return img;
}
这三个方法很简单的就把图片给正过来了,其实这些方法还有些缺陷,可以根据自己的用处进行更改。
纵观操作图片的方法,其主要在于BufferedImage对象的初始化和getGraphics().drawImage()的参数,搞清楚 drawImage()参数不同的各中处理,比如:
image=new BufferedImage(w,h, BufferedImage.TYPE_INT_RGB);
image.getGraphics().drawImage(bimage,0,0,200, 100, null); //缩小图片200*100
image.getGraphics().drawImage(bimage,200, 100, null); //截取图片200*100
等等操作。
其实图片的处理对于程序员来说是基本功,我只想是想写出我的思想上的理解,一方面怕忘记了,一方面也可以给别人给参照,有错误的地方希望高手能指出,虚心求教。
分享到:
相关推荐
FastReport报表及图片生成的操作文档是一份关于FastReport报表生成和图片生成的操作指南。该文档详细介绍了FastReport报表生成和图片生成的整个流程,从整体思路到具体实现细节。 一、整体思路 FastReport报表生成...
4. **数据图片生成**:如果需要根据数据生成图片,可以使用诸如`System.Drawing`或更高级的图形库如SkiaSharp。你可以根据接收到的数据,绘制图表,如折线图、柱状图等,反映数据的变化趋势。 5. **串口采集**:在...
在IT领域,尤其是在计算机视觉和机器学习中,图片数据生成器是至关重要的工具。这个名为“图片数据生成器.zip”的压缩包很可能包含了一个名为“PICtoCODE V1.0”的程序或脚本,用于帮助开发者生成、处理或增强图像...
最后,如果你的图片生成器支持动态生成图片,比如根据用户输入生成图表或数据可视化,那么你可能需要用到一些算法和数据结构,例如用于统计分析和图形布局的算法。 总的来说,Java图片生成器是一个结合了Java 2D...
PICtoCODE是一款绿色免费,小巧易用的图片数据生成工具,主要面向单片机系统LCD显示图片或打印图片而设计,它可以将黑白单色图片(支持BMP、JPEG、JPG、GIF等格式)转换为A51、C51、HEX等格式的数据文件,操作简单,...
总的来说,RGB数据生成BMP位图是一个结合了计算机图形学、随机数生成和文件格式理解的实践过程。通过这个过程,我们可以更好地理解图像的数字化表示以及如何将数字信息转化为可见的图像。如果你对此有深入的兴趣,...
- **附加功能**:图片Logo点阵数据生成、GB2312和GBK字符集支持、繁简字体转换、单字节字符处理、串口通讯与数据传输、汉字自动识别与非汉字字符清除等。 #### 2. 应用场景 该工具广泛应用于点阵LED大屏幕、LCD...
标题提到的"根据Excel模板,生成副本并添加数据,截取指定区域生成图片"是一种高效的工作流解决方案,它结合了Python编程语言和Microsoft Excel的特性。这个过程涉及到多个知识点,下面将详细解释。 首先,**Excel...
4. 图片存储字段:在描述中提到的“可生成数据库图片存储的字段”,这通常是指处理BLOB类型的数据,如图片、文档等。在C#实体类中,这类字段可能被表示为byte[]数组,而在数据库中则存储为VARBINARY或IMAGE类型。 5...
通过学习和实践这些知识点,开发者可以构建出功能强大、用户友好的图片生成小程序,满足用户在不同场景下的图片定制需求。无论是数据分析、个人创作还是商业应用,图片生成小程序都能发挥重要作用。
通过使用Python编程语言和相关的库,该工具能够实现自动化处理和生成文档,提高工作效率并减少人工操作的繁琐性。首先,该源码使用了Python的pandas库来读取和处理Excel文件中的数据。通过读取Excel文件,它可以获取...
二维码图片生成源代码是计算机编程领域中涉及到的一种技术,它主要利用特定的库或工具,如本例中的qrencode,来将数据编码为二维图形,即二维码。二维码是一种广泛应用于移动设备、产品包装、广告等多个领域的条形码...
验证码(CAPTCHA)是一种用于确认网络用户身份的安全技术,它要求用户输入由系统生成的一组随机字符或图像,以此来防止自动化的机器人程序或者恶意软件进行欺诈性操作。验证码的主要目的是保护网站免受垃圾邮件、...
总结起来,这个项目涵盖了前端的数据可视化、服务器端的图片处理和动态文档生成。ECharts用于前端图表绘制,其图片通过Ajax或Fetch发送到服务器。服务器端使用FreeMarker模板引擎处理数据并生成Word文档,Apache POI...
关于标签"php,图片生成",在实际项目中,PHP生成图片的应用非常广泛。例如: - **验证码**:生成随机字符串并转化为图片,防止机器人自动填写表单。 - **动态图表**:根据数据库数据动态生成统计图,使数据可视化...
每张图片的信息通常包括图片的二进制数据和图片的替代文本(用于非图片显示环境)。例如,我们可以定义一个名为`images`的List,其中每个元素包含`imageData`和`altText`两个属性。 然后,使用FreeMarker的`...
在C#编程中,串口通信...总的来说,通过C#的`SerialPort`类与单片机通信,结合第三方库如EPPlus生成Excel,利用`System.Drawing`绘制数据图片,我们可以构建一个功能完整的上位机应用,实现数据的接收、存储和可视化。
在标题“asp.net 导出数据与图片到excel”和描述中提到的,是关于如何在ASP.NET环境下将数据和图片导出到Excel文件的一个主题。这是一个常见的需求,尤其是在数据分析、报表生成或数据共享时。以下是一些相关的知识...
以上就是使用C#进行串口通信,以及将接收到的数据生成Excel和数据图片的基本步骤。这个过程涉及到C#的事件处理、文件操作、数据序列化等多个知识点,通过实践可以更好地理解和掌握这些技术。在实际项目中,你可能...
- `JButton`、`JTextField`和`JTextArea`等组件:可能用于用户输入数据、显示图表或交互操作。 - `LayoutManager`:管理组件在窗口中的布局。 3. **Java图形API**: - `Graphics2D`:Java 2D API的核心,用于...