




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 专业课所学知识的宏观角度
- 装饰公司销售年终工作总结
- 金融科技创新项目的可行性报告
- 2024年采购管理师复习技巧试题及答案
- 预防校园欺凌建设和谐校园
- 2025年安徽审计职业学院单招职业倾向性考试题库带答案
- 2025皮内注射操作
- 2025年安徽汽车职业技术学院单招职业技能测试题库及参考答案1套
- 2025年安徽艺术职业学院单招综合素质考试题库带答案
- 2025年达州职业技术学院单招职业技能考试题库完整
- 书籍设计出版合同范本
- 2025年法律文书考试试题及答案
- 2025年安庆医药高等专科学校单招职业适应性考试题库完美版
- 2024年东营市技师学院招聘工作人员考试真题
- 智能科学与技术专业建设思路
- 2025年台州职业技术学院高职单招职业技能测试近5年常考版参考题库含答案解析
- 血液透析专科考试题+参考答案
- 2025年江苏苏州市(12345)便民服务中心招聘座席代表人员高频重点提升(共500题)附带答案详解
- Unit6Topic2SectionB公开课课件仁爱英语八年级下册
- 《记念刘和珍君》教学课件高中语文选择性必修中册
- 2023年新疆中考英语试题(含答案)
评论
0/150
提交评论