版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、JAVA图像缩放处理 今天在网上看到了一篇关于JAVA图像处理的文章,博主贴出了一个处理类:特点是高品质缩小,具体代码如下:import java.awt.image.BufferedImage;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import javax.imageio.ImageIO;public class ImageScale privat
2、e int width; private int height; private int scaleWidth; double support = (double) 3.0; double contrib; double normContrib;
3、160; double tmpContrib; int startContrib, stopContrib; int nDots; int nHalfDots; public BufferedImage imageZoomOut(BufferedImage srcBufferImage, i
4、nt w, int h, boolean lockScale) width = srcBufferImage.getWidth(); height = srcBufferImage.getHeight(); scal
5、eWidth = w; if (lockScale) h = w * height / width;
6、60; if (DetermineResultSize(w, h) = 1) return srcBufferImage; CalContrib();
7、; BufferedImage pbOut = HorizontalFiltering(srcBufferImage, w); BufferedImage pbFinalOut = VerticalFiltering(pbOut, h); return pbFin
8、alOut; /* */* * 决定图像尺寸 */ private int DetermineResultSize(int w, int h) double
9、scaleH, scaleV; scaleH = (double) w / (double) width; scaleV = (double) h / (double) height; /
10、 需要判断一下scaleH,scaleV,不做放大操作 if (scaleH >= 1.0 && scaleV >= 1.0) return 1;
11、160; return 0; / end of DetermineResultSize() private double Lanczos(int i, int inWidth, int outWidth, double Support)
12、 double x; x = (double) i * (double) outWidth / (double) inWidth; return Math.sin(x * Math.PI) /
13、;(x * Math.PI) * Math.sin(x * Math.PI / Support) / (x * Math.PI / Support); / end of Lanczos() / / Assumption: same horizonta
14、l and vertical scaling factor / private void CalContrib() nHalfDots = (int) (double) width * support / (double) scaleWidth);
15、160; nDots = nHalfDots * 2 + 1; try contrib = new doublenDots;
16、0; normContrib = new doublenDots; tmpContrib = new doublenDots; catch (Exception e)
17、 System.out.println("init contrib,normContrib,tmpContrib" + e); int center = nHalfDots; &
18、#160; contribcenter = 1.0; double weight = 0.0; int i = 0; for (i = 1;
19、;i <= center; i+) contribcenter + i = Lanczos(i, width, scaleWidth, support); weight += c
20、ontribcenter + i; for (i = center - 1; i >= 0; i-) contribi =
21、0;contribcenter * 2 - i; weight = weight * 2 + 1.0; for (i = 0; i <= center
22、; i+) normContribi = contribi / weight; for (i = center + 1; i <&
23、#160;nDots; i+) normContribi = normContribcenter * 2 - i; / end of CalContrib()
24、; / 处理边缘 private void CalTempContrib(int start, int stop) double weight = 0; int i = 0; &
25、#160; for (i = start; i <= stop; i+) weight += contribi; for
26、60;(i = start; i <= stop; i+) tmpContribi = contribi / weight; / end of CalTem
27、pContrib() private int GetRedValue(int rgbValue) int temp = rgbValue & 0x00ff0000; return temp >> 16;
28、; private int GetGreenValue(int rgbValue) int temp = rgbValue & 0x0000ff00; return temp >> 8; &
29、#160; private int GetBlueValue(int rgbValue) return rgbValue & 0x000000ff; private int ComRGB(int redValue, int
30、 greenValue, int blueValue) return (redValue << 16) + (greenValue << 8) + blueValue; / 行水平滤波 private
31、 int HorizontalFilter(BufferedImage bufImg, int startX, int stopX, int start, int stop, int y, double pContrib)
32、 double valueRed = 0.0; double valueGreen = 0.0; double valueBlue = 0.0; int valueRGB = 0;
33、0; int i, j; for (i = startX, j = start; i <= stopX; i+, j+) valueR
34、GB = bufImg.getRGB(i, y); valueRed += GetRedValue(valueRGB) * pContribj; valueGreen += GetGreenValue(valueRGB)
35、60;* pContribj; valueBlue += GetBlueValue(valueRGB) * pContribj; valueRGB = ComRGB(Clip(int) v
36、alueRed), Clip(int) valueGreen), Clip(int) valueBlue); return valueRGB; / end of HorizontalFilter() / 图片水平滤波 private BufferedIma
37、ge HorizontalFiltering(BufferedImage bufImage, int iOutW) int dwInW = bufImage.getWidth(); int dwInH = bufImage.getHeight();
38、160; int value = 0; BufferedImage pbOut = new BufferedImage(iOutW, dwInH, BufferedImage.TYPE_INT_RGB); for (int x = 0;
39、x < iOutW; x+) int startX; int start; int X
40、;= (int) (double) x) * (double) dwInW) / (double) iOutW) + 0.5); int y = 0; startX
41、= X - nHalfDots; if (startX < 0) startX = 0;
42、; start = nHalfDots - X; else start = 0
43、; int stop; int stopX = X + nHalfDots;
44、 if (stopX > (dwInW - 1) stopX = dwInW - 1; &
45、#160; stop = nHalfDots + (dwInW - 1 - X); else
46、stop = nHalfDots * 2; if (start > 0 | stop < nDots - 1) &
47、#160; CalTempContrib(start, stop); for (y = 0; y < dwInH; y+)
48、 value = HorizontalFilter(bufImage, startX, stopX, start, stop, y, tmpContrib);
49、160; pbOut.setRGB(x, y, value); else
50、0; for (y = 0; y < dwInH; y+) value = HorizontalFilter(bufImage, startX, sto
51、pX, start, stop, y, normContrib); pbOut.setRGB(x, y, value); &
52、#160; return pbOut; / end of HorizontalFiltering() private
53、60;int VerticalFilter(BufferedImage pbInImage, int startY, int stopY, int start, int stop, int x, double pContrib)
54、160;double valueRed = 0.0; double valueGreen = 0.0; double valueBlue = 0.0; int valueRGB = 0;
55、 int i, j; for (i = startY, j = start; i <= stopY; i+, j+) valueRGB
56、 = pbInImage.getRGB(x, i); valueRed += GetRedValue(valueRGB) * pContribj; valueGreen += GetGreenValue(valueRGB)
57、160;* pContribj; valueBlue += GetBlueValue(valueRGB) * pContribj; valueRGB = ComRGB(Clip(int)
58、valueRed), Clip(int) valueGreen), Clip(int) valueBlue); / System.out.println(valueRGB); return valueRGB; / end of VerticalFilter()
59、160; private BufferedImage VerticalFiltering(BufferedImage pbImage, int iOutH) int iW = pbImage.getWidth(); int iH = pbImage.get
60、Height(); int value = 0; BufferedImage pbOut = new BufferedImage(iW, iOutH, BufferedImage.TYPE_INT_RGB); for
61、(int y = 0; y < iOutH; y+) int startY; int start; &
62、#160; int Y = (int) (double) y) * (double) iH) / (double) iOutH) + 0.5); startY = Y - nHalfDots; &
63、#160; if (startY < 0) startY = 0; start =&
64、#160;nHalfDots - Y; else start = 0; &
65、#160; int stop; int stopY = Y + nHalfDots; if (stopY
66、 > (int) (iH - 1) stopY = iH - 1; stop = nHalf
67、Dots + (iH - 1 - Y); else stop = nHalfDots * 2; &
68、#160; if (start > 0 | stop < nDots - 1) &
69、#160;CalTempContrib(start, stop); for (int x = 0; x < iW; x+)
70、 value = VerticalFilter(pbImage, startY, stopY, start, stop, x, tmpContrib); pbOut.setRGB(x, y, value)
71、; else for (int x = 0; x < iW; x+)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年小学三年级体育上学期体能测试卷
- 2025年小学二年级语文上学期拼音专项练习
- 2025私人车辆买卖合同范本参考
- 个性化技能提升路径探索与实践
- 2025年协管员考试题型及答案
- 2025年养老个人总结5篇
- 2025国考东营市海关监管岗位申论预测卷及答案
- 2025年下半年咸阳市县及县以下医疗机构定向招考易考易错模拟试题(共500题)试卷后附参考答案
- 2025年下半年周口科技职业学院招考教师易考易错模拟试题(共500题)试卷后附参考答案
- 2025企业全面股权转让合同范本
- 2025中国中信金融资产管理股份有限公司资产经营四部社会招聘笔试近年参考题库附带答案详解(3卷合一)
- 《行业会计比较》教案
- 小学语文教师业务考试试题及答案
- 江苏省南通市2023届高三第四次模拟考试化学试题
- 浪漫主义文学
- MT/T 154.5-1996液压支架产品型号编制和管理方法
- 设备停用、退役管理规范(试行)
- 物理学科核心素养课件
- DB32T 3753-2020 江苏省装配式建筑综合评定标准
- 药监系统官方培训 体外诊断试剂临床相关要求 2019-孙嵘
- JJF 1847-2020 电子天平校准规范(高清版)
评论
0/150
提交评论