// /////////////////////////////////////////////////////////////// // 最临近插值算法----不考虑坐标的小数部分 // 参数:img:要缩放的Image对象 // dstW:目标图像宽 // dstH:目标图像高 // comp:组件参数,比如Applet // /////////////////////////////////////////////////////////////// public static Image simpleScale(Image img, int dstW, int dstH) { OperateImage OI = new OperateImage(); int[] scaled, src; double widthFactor, heightFactor; int srcX = 0, srcY = 0, srcW, srcH; src = OI.takeImg(img, img.getWidth(null), img.getHeight(null)); scaled = new int[dstW * dstH]; // 存放缩放后的图片 srcW = img.getWidth(null); srcH = img.getHeight(null); widthFactor = srcW / (dstW + 0.0); // System.out.println("widthFactor:"+widthFactor); heightFactor = srcH / (dstH + 0.0); // System.out.println("heightFactor:"+heightFactor); for (int a = 0; a < dstH; a++) for (int b = 0; b < dstW; b++) { if ((b * widthFactor) % 1 >= 0.5) srcX = (int) (b * widthFactor) + 1; else srcX = (int) (b * widthFactor); if ((a * heightFactor) % 1 >= 0.5) srcY = (int) (a * heightFactor) + 1; else srcY = (int) (a * heightFactor); if (srcX > srcW - 1) srcX = srcW - 1; if (srcY > srcH - 1) srcY = srcH - 1; scaled[a * dstW + b] = src[srcY * srcW + srcX]; } // System.out.println("最临近插值算法完成!"); return OI.madeImg(scaled, dstW, dstH); }
// /////////////////////////////////////////////////////////////// // 双线性内插值算法 // 参数:img:要缩放的Image对象 // dstW:目标图像宽 // dstH:目标图像高 // comp:组件参数,比如Applet // // 公式:f(i+u,j+v) = (1-u)(1-v)f(i,j) + (1-u)vf(i,j+1) + u(1-v)f(i+1,j) + // uvf(i+1,j+1) // // /////////////////////////////////////////////////////////////// public static Image doubleLinearScale(Image img, int dstW, int dstH) { OperateImage OI = new OperateImage(); Image imgTemp; int[] scaled, src; int srcW, srcH; int R, G, B; double widthFactor, heightFactor, tempX, tempY; // double srcX_float = 0.0, srcY_float = 0.0;// 坐标的小数部分 // int srcX_int = 0, srcY_int = 0;// 坐标的整数部分 src = OI.takeImg(img, img.getWidth(null), img.getHeight(null)); ColorModel cm = ColorModel.getRGBdefault(); for (int j = 0; j < src.length; j++) { R = cm.getRed(src[j]); G = cm.getGreen(src[j]); B = cm.getBlue(src[j]); if (R >= 200 && G >= 200 && B >= 200) src[j] = 0xffffffff; else src[j] = 0xff000000; } scaled = new int[dstW * dstH]; // 存放缩放后的图片 srcW = img.getWidth(null); srcH = img.getHeight(null); widthFactor = srcW / (dstW + 0.0); // System.out.println("widthFactor:"+widthFactor); heightFactor = srcH / (dstH + 0.0); // System.out.println("heightFactor:"+heightFactor); for (int a = 0; a < dstH; a++) for (int b = 0; b < dstW; b++) { tempX = b * widthFactor; tempY = a * heightFactor; scaled[a * dstW + b] = getDestPixle(src, srcW, srcH, tempX, tempY); } // System.out.println("双线性内插值算法完成!"); imgTemp = OI.madeImg(scaled, dstW, dstH); ImageFilter filter = new BWFilter(); return Toolkit.getDefaultToolkit() .createImage(new FilteredImageSource(imgTemp.getSource(), filter)); // return imgTemp; }
// /////////////////////////////////////////////////////////////// // 最临近插值算法--考虑坐标的小数部分 // 参数:img:要缩放的Image对象 // dstW:目标图像宽 // dstH:目标图像高 // comp:组件参数,比如Applet // /////////////////////////////////////////////////////////////// public static Image simpleScaleSpcial(Image img, int dstW, int dstH) { OperateImage OI = new OperateImage(); int[] scaled, src; double widthFactor, heightFactor, tempX, tempY, distance, tempDis; double srcX_float = 0.0, srcY_float = 0.0; // 坐标的小数部分 int srcX_int = 0, srcY_int = 0; // 坐标的整数部分 int srcX = 0, srcY = 0, srcW, srcH; src = OI.takeImg(img, img.getWidth(null), img.getHeight(null)); scaled = new int[dstW * dstH]; // 存放缩放后的图片 srcW = img.getWidth(null); srcH = img.getHeight(null); widthFactor = srcW / (dstW + 0.0); // System.out.println("widthFactor:"+widthFactor); heightFactor = srcH / (dstH + 0.0); // System.out.println("heightFactor:"+heightFactor); for (int a = 0; a < dstH; a++) for (int b = 0; b < dstW; b++) { distance = Double.MAX_VALUE; tempX = b * widthFactor; tempY = a * heightFactor; srcX_int = (int) tempX; srcX_float = tempX % 1; srcY_int = (int) tempY; srcY_float = tempY % 1; tempDis = (srcX_float * srcX_float) + (srcY_float * srcY_float); if (tempDis < distance) // 左上角 (0,0) { srcX = srcX_int; srcY = srcY_int; distance = tempDis; } tempDis = ((srcX_float - 1) * (srcX_float - 1)) + (srcY_float * srcY_float); if (tempDis < distance) // 右上角 (1,0) { srcX = srcX_int + 1; srcY = srcY_int; distance = tempDis; } tempDis = (srcX_float * srcX_float) + ((srcY_float - 1) * (srcY_float - 1)); if (tempDis < distance) // 左下角 (0,1) { srcX = srcX_int; srcY = srcY_int + 1; distance = tempDis; } tempDis = ((srcX_float - 1) * (srcX_float - 1)) + ((srcY_float - 1) * (srcY_float - 1)); if (tempDis < distance) // 右下角 (1,1) { srcX = srcX_int + 1; srcY = srcY_int + 1; } if (srcX > srcW - 1) srcX = srcW - 1; if (srcY > srcH - 1) srcY = srcH - 1; scaled[a * dstW + b] = src[srcY * srcW + srcX]; } // System.out.println("最临近插值算法(特殊)完成!"); return OI.madeImg(scaled, dstW, dstH); }
// 生成home页面的主文章列表html代码 public String generateHomeMainHtml(List<TArticle> articles) throws Exception { String listHtml = ""; if (articles != null) { int size = articles.size(); for (int i = 0; i < size; i++) { TArticle article = articles.get(i); // 组织标签的html String tagsHtml = ""; String[] tags = article.getArticle_Tag().split(","); for (int j = 0; j < tags.length; j++) { String tag = URLEncoder.encode(URLEncoder.encode(tags[j], "utf-8")); if (j == 0) { tagsHtml += "<a title='" + tags[j] + "' rel='tag' href='/doit/search/" + tag + "/0/2/search' style='font-size:13px;'>" + tags[j] + "</a>"; } else { tagsHtml += " , <a title='" + tags[j] + "' rel='tag' href='/doit/search/" + tag + "/0/2/search' style='font-size:13px;'>" + tags[j] + "</a>"; } } OperateString operateString = new OperateString(); String contentHtml = article.getArticle_Content(); // String contentHtml = "dsafkjbsdkds<pre class='brush: js;'>function // helloSyntaxHighlighter(){return 'hi!';}</pre><div class='ui segment '><img src='123.png' // /><IMG src='456.png' /></div>afkjbsdkdsafkjbsdk中文结尾"; // 过滤图片 OperateImage operateImage = new OperateImage(); contentHtml = operateImage.filterImage(contentHtml); // 过滤html所有标签 contentHtml = operateString.filterHtmlTag(contentHtml); // 截取字符串 contentHtml = operateString.interceptCharacters(contentHtml, 0, 200); String item = ""; item += "<div id='item" + article.getArticle_ID() + "' class='ui stacked segment'>"; item += " <h2 class='article_title'>"; item += " <a href='/doit/show/" + article.getArticle_ID() + "' style='font-size:24px;'>" + article.getArticle_Title() + "</a>"; item += " </h2>"; item += " <h2></h2>"; item += " <div class='article_date'>"; item += " <span property='dc:date dc:created' content='2013-11-10T12:30:01+08:00' datatype='xsd:dateTime' rel='sioc:has_creator' style='margin-right:20px;'> 发布时间 : " + article.getArticle_Date() + " </span>"; item += " <span style='color:#434A54;'>Tags : </span>"; item += tagsHtml; item += " </div>"; item += " <div class='row'>"; item += " <a class='thumbnail' href='/doit/show/" + article.getArticle_ID() + "' style='float:left;width:240px;oveflow:hidden;'>"; item += " <img src='" + article.getArticle_Cover() + "' style='height: 175px; width: 100%; display: block;' data-src='holder.js/100%x175'>"; item += " </a>"; item += " <span id='artContent" + article.getArticle_ID() + "' class='sDiv article_content'>" + contentHtml + "</span>"; item += " </div>"; item += "</div>"; listHtml += item; } } System.out.println(listHtml); return listHtml; }