如题,有时需要用图片替换原来文件夹图片,但尺寸想保持不变,于是乎就写了以下代码片断,记录一下,留用。
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FilenameFilter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.imageio.ImageIO;
/**
*
*/
/**
* @author zhouzhengwei
*
*/
public class TestClass
{
/**
* @param args
* @throws UnsupportedEncodingException
*/
public static void main(final String[] args) throws Exception
{
//要替换的目录
final File file1 = new File(
"/Users/zhouzhengwei/Downloads/hybris6.2/hybris/bin/ext-customer-experience/personalizationsampledataaddon/resources/personalizationsampledataaddon/import/contentCatalogs/electronicsContentCatalog/images");
final File file11 = new File(
"/Users/zhouzhengwei/Downloads/hybris6.2/hybris/bin/ext-data/electronicsstore/resources/electronicsstore/import/sampledata");
//用这个目录下的图片替换原来目录
final File file2 = new File("/Users/zhouzhengwei/Documents/t3");
HttpGet("汽车", "/Users/zhouzhengwei/Documents/t3");
final File[] listFiles2 = file2.listFiles(new FilenameFilter()
{
public boolean accept(final File dir, final String name)
{
boolean b = false;
if (name.endsWith("jpg") || name.endsWith("jpeg"))
{
try
{
final BufferedInputStream in = new BufferedInputStream(new FileInputStream(dir + File.separator + name));
//字节流转图片对象
final Image bi = ImageIO.read(in);
//获取图像的高度,宽度
final int height = bi.getHeight(null);
final int width = bi.getWidth(null);
if ((float) width / (float) height > 2)
{
b = true;
}
in.close();
}
catch (final Exception e)
{
//e.printStackTrace();
}
return b;
}
else
{
return false;
}
}
});
final File[] listFiles3 = file2.listFiles(new FilenameFilter()
{
public boolean accept(final File dir, final String name)
{
boolean b = false;
if (name.endsWith("jpg") || name.endsWith("jpeg"))
{
try
{
final BufferedInputStream in = new BufferedInputStream(new FileInputStream(dir + File.separator + name));
//字节流转图片对象
final Image bi = ImageIO.read(in);
//获取图像的高度,宽度
final int height = bi.getHeight(null);
final int width = bi.getWidth(null);
if ((float) width / (float) height < 2)
{
b = true;
}
in.close();
}
catch (final Exception e)
{
//
}
return b;
}
else
{
return false;
}
}
});
disF(file1, listFiles2, listFiles3);
disF(file11, listFiles2, listFiles3);
}
public static void disF(final File f, final File[] listFiles2, final File[] listFiles3)
{
if (f.isDirectory())
{
final File[] listFiles = f.listFiles(new FilenameFilter()
{
public boolean accept(final File dir, final String name)
{
return !name.endsWith("DS_Store");
}
});
for (int i = 0; i < listFiles.length; i++)
{
disF(listFiles[i], listFiles2, listFiles3);
}
}
else
{
disD(f, listFiles2, listFiles3);
}
}
public static void disD(final File f, final File[] listFiles2, final File[] listFiles3)
{
if (!f.getName().endsWith("jpg"))
{
return;
}
//选择要替换图片的尺寸
// if (!(f.getName().contains("960x80") || f.getName().contains("770x80") || f.getName().contains("480x118") || f.getName()
// .contains("1400x80")))
// {
// return;
// }
try
{
final BufferedInputStream in = new BufferedInputStream(new FileInputStream(f));
//字节流转图片对象
final Image bi = ImageIO.read(in);
//获取图像的高度,宽度
final int height = bi.getHeight(null);
final int width = bi.getWidth(null);
final int k = (int) (Math.random() * (listFiles3.length));
File f2 = listFiles3[k];
final float ff = (float) width / (float) height;
if (ff >= 2)
{
if (listFiles2 == null || listFiles2.length == 0)
{
final int kk = (int) (Math.random() * (listFiles3.length));
f2 = listFiles3[kk];
}
else
{
final int kk = (int) (Math.random() * (listFiles2.length));
f2 = listFiles2[kk];
}
}
if (ff == 1)
{
final int kk = (int) (Math.random() * (listFiles3.length));
f2 = listFiles3[kk];
}
final BufferedInputStream in2 = new BufferedInputStream(new FileInputStream(f2));
final Image bi2 = ImageIO.read(in2);
final int height2 = bi2.getHeight(null);
final int width2 = bi2.getWidth(null);
float w = 0;
float h = 0;
//构建图片流
final BufferedImage tag = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
//绘制改变尺寸后的图
if ((float) width / (float) height > (float) width2 / (float) height2)
{
w = width;
h = height2 * ((float) width / (float) width2);
}
else
{
h = height;
w = width2 * ((float) height / (float) height2);
}
tag.getGraphics().drawImage(bi2, 0, 0, (int) w, (int) h, null);
//输出流
final BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(f));
System.out.println(f.getAbsolutePath());
ImageIO.write(tag, "jpg", out);
in.close();
in2.close();
out.close();
}
catch (final Exception e)
{
e.printStackTrace();
}
}
public static String HttpGet(final String str, final String dir) throws Exception
{
final String urlStr = "http://image.baidu.com/channel/listjson?fr=channel&tag1=" + URLEncoder.encode(str, "utf-8")
+ "&tag2=" + URLEncoder.encode("全部", "utf-8")
+ "&sorttype=1&pn=0&rn=5&ie=utf8&oe=utf-8&app=img.browse.channel.general";
final URL url = new URL(urlStr);
final URLConnection urlConnection = url.openConnection(); // 打开连接
System.out.println(urlConnection.getURL().toString());
final BufferedReader br = new BufferedReader(new InputStreamReader(urlConnection.getInputStream(), "utf-8")); // 获取输入流
String line = null;
final StringBuilder sb = new StringBuilder();
while ((line = br.readLine()) != null)
{
sb.append(line);
}
br.close();
//System.out.println(sb.toString());
final String regEx = "image_url\":\"([^\"]+\")";
final Pattern p = Pattern.compile(regEx);
final Matcher m = p.matcher(sb.toString());
while (m.find())
{
final String replaceAll = m.group().replaceFirst("image_url\":\"", "").replaceAll("jpg\"", "jpg");
writeFile(replaceAll, dir + File.separator + new Date().getTime() + ".jpg");
System.out.println(replaceAll);
}
return sb.toString();
}
public static void writeFile(final String strUrl, final String fileName)
{
URL url = null;
try
{
url = new URL(strUrl);
}
catch (final MalformedURLException e2)
{
e2.printStackTrace();
}
InputStream is = null;
try
{
is = url.openStream();
}
catch (final IOException e1)
{
e1.printStackTrace();
}
OutputStream os = null;
try
{
os = new FileOutputStream(fileName);
int bytesRead = 0;
final byte[] buffer = new byte[8192];
while ((bytesRead = is.read(buffer, 0, 8192)) != -1)
{
os.write(buffer, 0, bytesRead);
}
}
catch (final Exception e)
{
//
}
}
}