`
zcw_java
  • 浏览: 303754 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java对图片的处理

 
阅读更多
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)用程序把图片正过来

在网上搜了半天,终于搜到一个高手写的三个操作图片的方法,试了试,很不错,有些地方进行了修改,很可惜忘记了这个高手的出处,在此感谢一下,借用
// 得到图像缩放比率
// @param sourceWidth 源图宽
// @param sourceHeight 源图高

// @param scaled 变化比例值 要想把图片放大变小只需改变该值
// @return scaling缩放比率
public static double getScaling(int sourceWidth, int sourceHeight,double scaled) {
int snapHeightMax = 120; // 缩放后最小高度
int snapWidthMax = 150; // 缩放后最小宽度

double widthScaling = ((double) snapWidthMax * (double) scaled) / (double) sourceWidth;
double heightScaling = ((double) snapHeightMax * (double) scaled) / (double) sourceHeight;
double scaling = (widthScaling < heightScaling) ? widthScaling: heightScaling;

return scaling;
}


//按比例压缩图片
// @param bufferedimage 目标图像
// @scaled 缩放倍数
// @param flg 是否要对图片压缩
// @return


public static BufferedImage resizeImage(final BufferedImage bufferedimage,
final double scaled,final boolean flg){
int type = bufferedimage.getColorModel().getTransparency();
BufferedImage img;
Graphics2D graphics2d;
int wg = bufferedimage.getWidth();
int hg = bufferedimage.getHeight();
if(flg){
double scaleds=getScaling(wg,hg,scaled); //得到倍率
int w=(int)(wg*scaleds);
int h=(int)(hg*scaleds);
System.out.println(w+" "+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);
}
graphics2d.dispose();
return img;
}

--------------------------------------------------------------------------
// 旋转图片为指定角度
// @param bufferedimage 目标图像
// @param degree 旋转角度
// @return


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;
}

----------------------------------------------------------------------------------

// 水平翻转图像
// @param bufferedimage 目标图像
// @return

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

等等操作。
分享到:
评论

相关推荐

    java 图片处理工具类 java 图片处理工具类

    java 图片处理工具类 java 图片处理工具类 java 图片处理工具类 java 图片处理工具类 java 图片处理工具类 java 图片处理工具类 java 图片处理工具类 java 图片处理工具类 java 图片处理工具类 java 图片处理工具类 ...

    java高清处理图片

    在实际项目开发中,图片处理是一项常见的需求,包括但不限于图片的压缩、尺寸调整以及添加水印等操作。传统的Java库虽然能够实现这些功能,但往往在图片质量方面不尽如人意,尤其是当图片尺寸被大幅度压缩时,画质...

    Java图片处理类库SimpleImage.zip

    SimpleImage是阿里巴巴的一个Java图片处理的类库,可以实现图片缩略、水印等处理。 SimpleImage中的ImageRender是图片处理的基类,它是一个抽象类,我们看到,该类中定义了一个抽象方法render(),同时持有一个对...

    java处理图片背景颜色的方法

    在标签中,作者列出了四个关键词:“java 处理图片背景颜色”、“java 图片背景颜色替换”、“java 图片背景颜色更改”、“java 蓝底寸照批量转换为白底”,这些关键词都与 Java 处理图片背景颜色相关。 在部分内容...

    java图片压缩处理

    java图片压缩处理java图片压缩处理java图片压缩处理java图片压缩处理java图片压缩处理java图片压缩处理

    java处理上传后的图片

    3. **资源回收**:在完成图片处理后,及时释放资源是非常重要的,以避免内存泄漏等问题。 #### 六、总结 本文详细介绍了如何使用Java对上传的图片进行处理,特别是缩放功能。通过对给定代码的分析,我们可以看到...

    java图片处理

    文件内含java 处理图片大小等比例缩放,指定颜色改变颜色。根据不同图片设置阴影图片。

    java图片处理工具类JAR包 java-image-scalingjar

    java图片处理工具类JAR包 java-image-scalingjar

    java对图片进行处理

    在Java编程语言中,处理图片是一项常见的任务,...通过熟练掌握这些技术,开发者可以轻松地在各种应用中实现图片处理功能。在实际项目中,可能还需要考虑性能优化、错误处理和兼容性问题,以确保代码的质量和可靠性。

    Java图像处理类库 Java Image Filters

    Java图像处理类库,如Java Image Filters,是Java平台上的一个重要工具,用于对数字图像进行各种操作和修改。这些类库通常包含了一系列的类和方法,可以实现图像的过滤、调整、裁剪、旋转、合成等多种功能,为开发者...

    java图片高级处理(渐变,锐化,边缘检测)

    总的来说,Java图片高级处理涉及多个层次的技术,从简单的颜色变换到复杂的数学算法,都需要扎实的编程基础和对图像处理原理的理解。通过学习和实践,你可以创建出具有独特视觉效果的应用程序或工具,满足各种图像...

    Java图片处理工具ImageMagick

    Java图片处理工具ImageMagick是一个强大的跨平台图形处理库,它允许开发人员在Java应用程序中进行复杂的图像操作,包括但不限于转换、编辑、合成图像以及处理大量格式的图像文件。ImageMagick是由C语言编写的,但...

    java 图片处理源码

    这是一个Java图片处理程序。 Java 开源代码,高手学习 java 图片处理源码

    Java图片处理技术

    在Java编程语言中,处理...综上所述,这段代码展示了Java如何利用AWT库进行图片处理,包括添加图片和文字水印,以及处理透明度和定位。这些都是Java图形处理的基本技术,对于开发涉及图像编辑和处理的应用非常有用。

    java图片压缩处理(可以压缩为任意大小

    除了Java 2D API,还有一些第三方库,如Apache Commons Imaging(以前的Sanselan)和ImageMagick,它们提供了更丰富的图片处理功能,包括高级压缩算法和更多格式支持。 总结来说,Java中的图片压缩涉及到读取图片、...

    java图片旋转处理

    这个“java图片旋转处理”包提供了方便的方法,使开发者能够轻松地对图片进行旋转。为了理解这些方法的工作原理以及如何使用它们,我们需要了解一些核心概念和技术。 首先,Java中的图像处理主要通过Java AWT...

    java图片缩放 java缩略图 缩略图 java图片处理

    java图片缩放 java缩略图 缩略图 java图片处理

    java处理图片大小等比例缩放,自定义修改图片大小,截取,水印

    在压缩包中的"java图片大小转换"文件中,很可能包含了实现这些功能的示例代码和使用说明,可以参考学习以加深理解。在实际开发中,我们还可以借助第三方库如`ImageMagick`、`Java Advanced Imaging (JAI)`或`JavaFX`...

    java+png透明图片处理方法

    8. **其他文件**: `实例28 图片的处理.rar`和`3438_files`、`80922_files`、`2502_files`这些文件可能包含的是实际的代码实例、测试数据或者其他的辅助资源,用于展示如何在Java中处理PNG图片的透明度。 了解这些...

    java 图像处理(模糊处理、锐化处理)

    在Java编程语言中,图像处理是一项重要的功能,可以用于创建、编辑或操作图像。本教程将探讨两个关键的图像处理技术:模糊处理和锐化处理。这些技术在图像分析、图像增强以及艺术创作中有着广泛的应用。 模糊处理是...

Global site tag (gtag.js) - Google Analytics