From 236437c099ee0d06d5abb607df101d3da2959456 Mon Sep 17 00:00:00 2001 From: KKSU <15274802129@163.com> Date: Tue, 28 May 2024 14:17:56 +0800 Subject: [PATCH] 图片上传 --- src/main/java/cc/mrbird/febs/mall/test/FingerPrint.java | 317 +++++++++++++++++++++ src/main/java/cc/mrbird/febs/mall/test/PixelateImage.java | 95 ++++++ src/main/java/cc/mrbird/febs/mall/test/ImageToChar.java | 156 ++++++++++ src/main/java/cc/mrbird/febs/mall/test/getGray.java | 51 +++ pom.xml | 6 src/main/java/cc/mrbird/febs/mall/test/DYDelMark.java | 162 ++++++++++ src/main/java/cc/mrbird/febs/mall/test/imageTest.java | 100 ++++++ 7 files changed, 887 insertions(+), 0 deletions(-) diff --git a/pom.xml b/pom.xml index e9a9486..8f21dc9 100644 --- a/pom.xml +++ b/pom.xml @@ -30,6 +30,12 @@ <dependencies> <dependency> + <groupId>com.madgag</groupId> + <artifactId>animated-gif-lib</artifactId> + <version>1.4</version> + </dependency> + + <dependency> <groupId>org.web3j</groupId> <artifactId>core</artifactId> <version>4.5.5</version> diff --git a/src/main/java/cc/mrbird/febs/mall/test/DYDelMark.java b/src/main/java/cc/mrbird/febs/mall/test/DYDelMark.java new file mode 100644 index 0000000..945de93 --- /dev/null +++ b/src/main/java/cc/mrbird/febs/mall/test/DYDelMark.java @@ -0,0 +1,162 @@ +package cc.mrbird.febs.mall.test; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; + +import java.io.IOException; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class DYDelMark { + public static void main(String[] args) { + String content = "https://v.douyin.com/iLwxgYHE/"; + JSONObject douYData = extractDouYinData(content); + if (douYData != null) { + System.out.println(douYData); + } else { + System.out.println(1); + } + } + private static JSONObject extractDouYinData(String content) { + String url = extractUrl(content); + + if (url != null) { + if (content.contains("douyin.com")) { + if (content.contains("live.douyin.com")) { + System.out.println("直播"); + return null; + } else { + String dyUrlOrId = processContent(content); + String videoId = isNumeric(dyUrlOrId) ? dyUrlOrId : extractVideoId(dyUrlOrId); + if (videoId!=null){ + JSONArray dyData = serverGetDy(videoId); + + if (dyData != null && dyData.size() > 0) { + JSONObject jsonData = dyData.getJSONObject(0); + return buildDouYinData(jsonData); + } + } + } + } + } + return null; + } + private static JSONObject buildDouYinData(JSONObject jsonData) { + JSONObject douYData = new JSONObject(); + douYData.put("desc", jsonData.getString("desc")); + + JSONObject author = jsonData.getJSONObject("author"); + douYData.put("nickname", author.getString("nickname")); + + JSONObject videoJson = jsonData.getJSONObject("video"); + JSONObject coverJson = videoJson.getJSONObject("cover"); + String coverUrl = coverJson.getJSONArray("url_list").getString(0); + douYData.put("coverUrl", coverUrl); + + if (jsonData.getJSONArray("images") != null) { + JSONArray images = jsonData.getJSONArray("images"); + JSONArray imageArray = new JSONArray(); + + for (int i = 0; i < images.size(); i++) { + JSONObject image = images.getJSONObject(i); + JSONArray urlList = image.getJSONArray("url_list"); + imageArray.add(urlList.get(0)); + } + + douYData.put("type", 2); + douYData.put("data", imageArray); + } else { + JSONObject playAddr = videoJson.getJSONObject("play_addr"); + String uri = playAddr.getString("uri"); + String videoUrl = "https://www.iesdouyin.com/aweme/v1/play/?video_id=" + uri + "&ratio=1080p&line=0"; + douYData.put("type", 1); + douYData.put("data", videoUrl); + } + + return douYData; + } + public static String processContent(String content) { + String douyinUrl = extractMatch(content, "v\\.douyin\\.com/[a-zA-Z0-9]+"); + if (douyinUrl != null) { + return "https://" + douyinUrl; + } + String digit = extractMatch(content, "\\d{19}"); + return digit; + } + private static String extractMatch(String content, String regex) { + Pattern pattern = Pattern.compile(regex); + Matcher matcher = pattern.matcher(content); + return matcher.find() ? matcher.group(0) : null; + } + public static boolean isNumeric(String str) { + return str.matches("\\d+"); + } + private static String extractUrl(String text) { + // 匹配网址的正则表达式 + String regex = "https?://\\S+"; + Pattern pattern = Pattern.compile(regex); + Matcher matcher = pattern.matcher(text); + + // 查找匹配的链接 + if (matcher.find()) { + return matcher.group(); + } + + return null; + } + public static String extractVideoId(String link) { + String redirectLink = getRedirectUrl(link); + Pattern patternVideo = Pattern.compile("/video/(\\d+)"); + Pattern patternNote = Pattern.compile("/note/(\\d+)"); + + Matcher matcherVideo = patternVideo.matcher(redirectLink); + Matcher matcherNote = patternNote.matcher(redirectLink); + + if (matcherVideo.find()) { + return matcherVideo.group(1); + } else if (matcherNote.find()) { + return matcherNote.group(1); + } else { + return null; + } + } + public static String getRedirectUrl(String url) { + OkHttpClient client = new OkHttpClient(); + try { + Request request = new Request.Builder() + .url(url) + .get() + .build(); + Response response = client.newCall(request).execute(); + return response.request().url().toString(); + + } catch (IOException e) { + e.printStackTrace(); + } + + return null; + } + private static JSONArray serverGetDy(String itemIds){ + OkHttpClient client = new OkHttpClient().newBuilder().build(); + Request Request = new Request.Builder() + //不知道这个a_bogus是啥 可能是个算法 随便填写或空即可 + .url("https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/?reflow_source=reflow_page&item_ids="+itemIds+"&a_bogus=sdfds") + .addHeader("content-type", "application/x-www-form-urlencoded") + .get() + .build(); + try { + Response response = client.newCall(Request).execute(); + JSONObject jsonObject= JSONObject.parseObject(response.body().string()); + if (jsonObject.getInteger("status_code").equals(0)){ + return jsonObject.getJSONArray("item_list"); + } + return null; + } catch (IOException e) { + e.printStackTrace(); + return null; + } + } +} diff --git a/src/main/java/cc/mrbird/febs/mall/test/FingerPrint.java b/src/main/java/cc/mrbird/febs/mall/test/FingerPrint.java new file mode 100644 index 0000000..788a348 --- /dev/null +++ b/src/main/java/cc/mrbird/febs/mall/test/FingerPrint.java @@ -0,0 +1,317 @@ +package cc.mrbird.febs.mall.test; + +import javax.imageio.ImageIO; +import java.awt.*; +import java.awt.color.ColorSpace; +import java.awt.image.BufferedImage; +import java.awt.image.ColorConvertOp; +import java.io.File; +import java.io.IOException; +import java.util.Arrays; + +/** + * 图片是采用phash算法,一共分为四步吧. + * + * 1.将图片缩放到16*16大小,这是我们选择的合适的大小,假如宽高不一样,直接将其压到16*16,去掉细节,只保留宏观; + * + * 2.图片一共是16*16的,共256个像素,我们将图片进行灰度化,灰度化就是只有黑白灰三种,从白到黑,一共分了255层; + * + * 3.灰度化之后将图片进行DCT转换(离散余弦变化),因为为了识别有的图片旋转,这个DCT转换是将图片进行了一种压缩算法; + * + * 4.我们对这个算法进行了优化,因为之前是计算像素的均值,我们为了更准确,我们取RGB,rgb一共分为255个像素,我们将255个像素分为16段,如果像素大于0-16记为0,17到32记为1,直到255,这样就得到255位的二进制,这就是这张图片的指纹码. + * + * 得到唯一标识的指纹码之后怎么去计算像素度呢? + * + * 通过汉明距离比较两个二进制距离,如果距离小于<10的话,我们就判定两张图片相似.如果两个指纹码(二进制)一模一样,我们就判定两个是一张图片,或者类似; + */ +/** + * 视频相似度算法: + * 视频的话我们是通过ffmpeg(ff am pig),它是一个专门处理视频的框架,可以从视频中按针提取图片.然后就按照图片的相似度取对比了... + */ + +/** + * https://blog.csdn.net/weixin_34095889/article/details/91923072?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522171652008316800182787012%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=171652008316800182787012&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-4-91923072-null-null.142^v100^pc_search_result_base8&utm_term=java%20%E6%8A%8A%E5%9B%BE%E7%89%87%E8%BD%AC%E6%8D%A2%E6%88%90%E9%BB%91%E7%99%BD%E7%81%B0%E5%83%8F%E7%B4%A0%E9%A3%8E%E6%A0%BC&spm=1018.2226.3001.4187 + * 均值哈希实现图像指纹比较 + */ +public class FingerPrint { + + public static void main(String[] args) { + FingerPrint fp1 = null; + FingerPrint fp2 = null; + try { + fp1 = new FingerPrint(ImageIO.read(new File("D:\\image\\F1.png"))); + fp2 = new FingerPrint(ImageIO.read(new File("D:\\image\\Z1.jpg"))); + } catch (IOException e) { + e.printStackTrace(); + } + System.out.println(fp1.toString(false)); + System.out.println(fp2.toString(false)); + System.out.printf("sim=%f",fp1.compare(fp2)); + } + + /** + * 图像指纹的尺寸,将图像resize到指定的尺寸,来计算哈希数组 + */ + private static final int HASH_SIZE=16; + /** + * 保存图像指纹的二值化矩阵 + */ + private final byte[] binaryzationMatrix; + public FingerPrint(byte[] hashValue) { + if(hashValue.length!=HASH_SIZE*HASH_SIZE) + throw new IllegalArgumentException(String.format("length of hashValue must be %d",HASH_SIZE*HASH_SIZE )); + this.binaryzationMatrix=hashValue; + } + public FingerPrint(String hashValue) { + this(toBytes(hashValue)); + } + public FingerPrint (BufferedImage src){ + this(hashValue(src)); + } + private static byte[] hashValue(BufferedImage src){ + BufferedImage hashImage = resize(src,HASH_SIZE,HASH_SIZE); + byte[] matrixGray = (byte[]) toGray(hashImage).getData().getDataElements(0, 0, HASH_SIZE, HASH_SIZE, null); + return binaryzation(matrixGray); + } + /** + * 从压缩格式指纹创建{@link FingerPrint}对象 + * @param compactValue + * @return + */ + public static FingerPrint createFromCompact(byte[] compactValue){ + return new FingerPrint(uncompact(compactValue)); + } + + public static boolean validHashValue(byte[] hashValue){ + if(hashValue.length!=HASH_SIZE) + return false; + for(byte b:hashValue){ + if(0!=b&&1!=b)return false; + } + return true; + } + public static boolean validHashValue(String hashValue){ + if(hashValue.length()!=HASH_SIZE) + return false; + for(int i=0;i<hashValue.length();++i){ + if('0'!=hashValue.charAt(i)&&'1'!=hashValue.charAt(i))return false; + } + return true; + } + public byte[] compact(){ + return compact(binaryzationMatrix); + } + + /** + * 指纹数据按位压缩 + * @param hashValue + * @return + */ + private static byte[] compact(byte[] hashValue){ + byte[] result=new byte[(hashValue.length+7)>>3]; + byte b=0; + for(int i=0;i<hashValue.length;++i){ + if(0==(i&7)){ + b=0; + } + if(1==hashValue[i]){ + b|=1<<(i&7); + }else if(hashValue[i]!=0) + throw new IllegalArgumentException("invalid hashValue,every element must be 0 or 1"); + if(7==(i&7)||i==hashValue.length-1){ + result[i>>3]=b; + } + } + return result; + } + + /** + * 压缩格式的指纹解压缩 + * @param compactValue + * @return + */ + private static byte[] uncompact(byte[] compactValue){ + byte[] result=new byte[compactValue.length<<3]; + for(int i=0;i<result.length;++i){ + if((compactValue[i>>3]&(1<<(i&7)))==0) + result[i]=0; + else + result[i]=1; + } + return result; + } + /** + * 字符串类型的指纹数据转为字节数组 + * @param hashValue + * @return + */ + private static byte[] toBytes(String hashValue){ + hashValue=hashValue.replaceAll("\\s", ""); + byte[] result=new byte[hashValue.length()]; + for(int i=0;i<result.length;++i){ + char c = hashValue.charAt(i); + if('0'==c) + result[i]=0; + else if('1'==c) + result[i]=1; + else + throw new IllegalArgumentException("invalid hashValue String"); + } + return result; + } + /** + * 缩放图像到指定尺寸 + * @param src + * @param width + * @param height + * @return + */ + private static BufferedImage resize(Image src,int width,int height){ + BufferedImage result = new BufferedImage(width, height, + BufferedImage.TYPE_3BYTE_BGR); + Graphics g = result.getGraphics(); + try{ + g.drawImage(src.getScaledInstance(width, height, Image.SCALE_SMOOTH), 0, 0, null); + }finally{ + g.dispose(); + } + return result; + } + /** + * 计算均值 + * @param src + * @return + */ + private static int mean(byte[] src){ + long sum=0; + // 将数组元素转为无符号整数 + for(byte b:src)sum+=(long)b&0xff; + return (int) (Math.round((float)sum/src.length)); + } + /** + * 二值化处理 + * @param src + * @return + */ + private static byte[] binaryzation(byte[]src){ + byte[] dst = src.clone(); + int mean=mean(src); + for(int i=0;i<dst.length;++i){ + // 将数组元素转为无符号整数再比较 + dst[i]=(byte) (((int)dst[i]&0xff)>=mean?1:0); + } + return dst; + + } + /** + * 转灰度图像 + * @param src + * @return + */ + private static BufferedImage toGray(BufferedImage src){ + if(src.getType()==BufferedImage.TYPE_BYTE_GRAY){ + return src; + }else{ + // 图像转灰 + BufferedImage grayImage = new BufferedImage(src.getWidth(), src.getHeight(), + BufferedImage.TYPE_BYTE_GRAY); + new ColorConvertOp(ColorSpace.getInstance(ColorSpace.CS_GRAY), null).filter(src, grayImage); + return grayImage; + } + } + + @Override + public String toString() { + return toString(true); + } + /** + * @param multiLine 是否分行 + * @return + */ + public String toString(boolean multiLine) { + StringBuffer buffer=new StringBuffer(); + int count=0; + for(byte b:this.binaryzationMatrix){ + buffer.append(0==b?'0':'1'); + if(multiLine&&++count%HASH_SIZE==0) + buffer.append('\n'); + } + return buffer.toString(); + } + @Override + public boolean equals(Object obj) { + if(obj instanceof FingerPrint){ + return Arrays.equals(this.binaryzationMatrix,((FingerPrint)obj).binaryzationMatrix); + }else + return super.equals(obj); + } + + /** + * 与指定的压缩格式指纹比较相似度 + * @param compactValue + * @return + * @see #compare(FingerPrint) + */ + public float compareCompact(byte[] compactValue){ + return compare(createFromCompact(compactValue)); + } + /** + * @param hashValue + * @return + * @see #compare(FingerPrint) + */ + public float compare(String hashValue){ + return compare(new FingerPrint(hashValue)); + } + /** + * 与指定的指纹比较相似度 + * @param hashValue + * @return + * @see #compare(FingerPrint) + */ + public float compare(byte[] hashValue){ + return compare(new FingerPrint(hashValue)); + } + /** + * 与指定图像比较相似度 + * @param image2 + * @return + * @see #compare(FingerPrint) + */ + public float compare(BufferedImage image2){ + return compare(new FingerPrint(image2)); + } + /** + * 比较指纹相似度 + * @param src + * @return + * @see #compare(byte[], byte[]) + */ + public float compare(FingerPrint src){ + if(src.binaryzationMatrix.length!=this.binaryzationMatrix.length) + throw new IllegalArgumentException("length of hashValue is mismatch"); + return compare(binaryzationMatrix,src.binaryzationMatrix); + } + /** + * 判断两个数组相似度,数组长度必须一致否则抛出异常 + * @param f1 + * @param f2 + * @return 返回相似度(0.0~1.0) + */ + private static float compare(byte[] f1,byte[] f2){ + if(f1.length!=f2.length) + throw new IllegalArgumentException("mismatch FingerPrint length"); + int sameCount=0; + for(int i=0;i<f1.length;++i){ + if(f1[i]==f2[i])++sameCount; + } + return (float)sameCount/f1.length; + } + public static float compareCompact(byte[] f1,byte[] f2){ + return compare(uncompact(f1),uncompact(f2)); + } + public static float compare(BufferedImage image1,BufferedImage image2){ + return new FingerPrint(image1).compare(new FingerPrint(image2)); + } + +} diff --git a/src/main/java/cc/mrbird/febs/mall/test/ImageToChar.java b/src/main/java/cc/mrbird/febs/mall/test/ImageToChar.java new file mode 100644 index 0000000..ea4d0a2 --- /dev/null +++ b/src/main/java/cc/mrbird/febs/mall/test/ImageToChar.java @@ -0,0 +1,156 @@ +package cc.mrbird.febs.mall.test; + +import cn.hutool.core.util.ObjectUtil; +import com.madgag.gif.fmsware.AnimatedGifEncoder; + +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; + +/** + * 基于Java的图片字符画(含动图) + * https://blog.csdn.net/weixin_53070478/article/details/127183821?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_utm_term~default-4-127183821-blog-125549681.235^v43^pc_blog_bottom_relevance_base9&spm=1001.2101.3001.4242.3&utm_relevant_index=7 + */ +public class ImageToChar { + + static char[] ss = " `.^,:~\"<!ct+{i7?u30pw4A8DX%#HWM".toCharArray(); + + /** + * 将输入的图片转换成灰度图片 + * @param bi + * @return + */ + public static BufferedWriter ImageToChar(BufferedImage bi,String target){ //定义灰度方法 返回值为BufferedImage对象 + int width = bi.getWidth(); + int height =bi.getHeight(); + BufferedWriter bw = null; //构建新的对象模型 + try { + bw = new BufferedWriter(new FileWriter(target),360); + + // 遍历图片的RGB值,把得到的灰度值存到bufferedImage_end中,然后返回bufferedImage_end + int autoAdd = 2;//自增 + for (int j = 0; j < height; j += autoAdd) { + for (int i = 0; i < width; i += autoAdd) { + int pixel = bi.getRGB(i, j); + int[] rgb = new int[3]; + rgb[0] = pixel >> 16 & 0xff; + rgb[1] = pixel >> 8 & 0xff; + rgb[2] = pixel & 0xff; + int Gray = (rgb[0] * 28 + rgb[1] * 151 + rgb[2] * 77) >> 8; //通过三原色值计算像素点的灰度 + int x = Gray * ss.length / 255 % ss.length; //灰度值的百分比 计算出相应密度的字符表 + bw.write(ss[x]); //输出该字符 + bw.write(ss[x]); + } + bw.newLine(); + } + bw.flush(); + } catch (IOException e) { + e.printStackTrace(); + } + return bw; + } + + /** + * GIF转图片 + * https://blog.csdn.net/adminstate/article/details/128917090?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522171653969716800197097670%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=171653969716800197097670&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-128917090-null-null.142^v100^pc_search_result_base8&utm_term=java%20%E5%9B%BE%E7%89%87%E8%BD%ACGif&spm=1018.2226.3001.4187 + * @param args + */ +// public static void main(String[] args) { +// Integer scaleSize = 360; +// GifDecoder gd = new GifDecoder(); +// try{ +// gd.read(Files.newInputStream(new File("D:\\image\\imageGif.gif").toPath())); +// for (int i = 0; i < gd.getFrameCount(); i++) { //逐帧转换为图片。 +// BufferedImage frame = gd.getFrame(i); +// float width = frame.getWidth(); // 像素 +// float height = frame.getHeight(); // 像素 +// float scale = width/scaleSize; +// BufferedImage buffImg = new BufferedImage(scaleSize, (int)(height/scale), BufferedImage.TYPE_INT_RGB); +// //使用TYPE_INT_RGB修改的图片会变色 +// buffImg.getGraphics().drawImage( +// frame.getScaledInstance(scaleSize, (int)(height/scale), Image.SCALE_SMOOTH), 0, +// 0, null); +// +// ImageIO.write(buffImg, "jpg", new File("D:\\image\\gif\\"+i+".png")); +// } +// }catch(IOException e){ +// System.out.println(e); +// } +// } + + + /** + * 图片转GIF + * https://blog.csdn.net/adminstate/article/details/128917090?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522171653969716800197097670%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=171653969716800197097670&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-128917090-null-null.142^v100^pc_search_result_base8&utm_term=java%20%E5%9B%BE%E7%89%87%E8%BD%ACGif&spm=1018.2226.3001.4187 + * @param args + */ + public static void main(String[] args) { + // 存放jpg文件目录 + String inpath = "D:\\image\\gif\\"; + + //生成GIF + AnimatedGifEncoder animatedGifEncoder = new AnimatedGifEncoder(); + animatedGifEncoder.setRepeat(0); + animatedGifEncoder.start("D:\\image\\gif\\screenshot.gif"); + + try{ + //获取目录下所有jpg及其他非gif图片文件 + String[] pic = new File(inpath).list(); + BufferedImage[] src = new BufferedImage[pic.length]; + + for (int i = 0; i <= src.length; i++) { + String pngPath = inpath + i + ".png"; + if(new File(pngPath).exists()){ + animatedGifEncoder.setDelay(100); //设置播放间隔 + src[i] = ImageIO.read(new File(pngPath)); // 读入需要播放的jpg文件 + animatedGifEncoder.addFrame(src[i]); //添加到帧中 + } + } + animatedGifEncoder.finish(); + }catch(IOException e){ + System.err.println("合成gif图失败"); + } + } + + /** + * 将GIF图片转换成字符串 + * @param args + */ +// public static void main(String[] args) { +// GifDecoder gd = new GifDecoder(); +// try{ +// +// gd.read(Files.newInputStream(new File("D:\\image\\gif\\screenshot.gif").toPath())); +// System.out.println(gd.getFrameCount()); +// for (int i = 0; i < gd.getFrameCount(); i++) { //逐帧转换为字符集。 +// System.out.println(gd.getFrameCount()); +// BufferedImage frame = gd.getFrame(i); +// ImageToChar(frame,"D:\\image\\ImageToChar.txt"); //参数提供缓冲图片对象,以及目标文本输出地址。 +// try { +// Thread.sleep(500); +// } catch (InterruptedException e) { +// e.printStackTrace(); +// } +// } +// }catch(IOException e){ +// System.out.println(e); +// } +// } + + /** + * 将图片转换成字符串 + * @param args + */ +// public static void main(String[] args) { +// try{ +// ImageToChar( +// ImageIO.read(new File("D:\\image\\outDpi.png")), +// "D:\\image\\ImageToChar.txt"); +// }catch(IOException e){ +// System.out.println(e); +// } +// } +} diff --git a/src/main/java/cc/mrbird/febs/mall/test/PixelateImage.java b/src/main/java/cc/mrbird/febs/mall/test/PixelateImage.java new file mode 100644 index 0000000..a1d2709 --- /dev/null +++ b/src/main/java/cc/mrbird/febs/mall/test/PixelateImage.java @@ -0,0 +1,95 @@ +package cc.mrbird.febs.mall.test; + +import com.sun.image.codec.jpeg.JPEGCodec; +import com.sun.image.codec.jpeg.JPEGEncodeParam; +import com.sun.image.codec.jpeg.JPEGImageEncoder; + +import javax.imageio.ImageIO; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +public class PixelateImage { + + public static void main(String[] args) { + handleDpi(new File("D:\\image\\inputDpi.png"),50,50); + getPixel("D:\\image\\input.png"); + try { + resizeImage("D:\\image\\input.png","D:\\image\\output.png",360);//将图片压缩至100宽 + } catch (IOException e) { + e.printStackTrace(); + } + } + + /** + * 功能:获取图片像素 + * * @param filePath 图片路径 + */ + public static void getPixel(String filePath){ + File file = new File(filePath); + BufferedImage bi = null; + try { + bi = ImageIO.read(file); + } catch (Exception e) { + e.printStackTrace(); + } + int width = bi.getWidth(); // 像素 + int height = bi.getHeight(); // 像素 + System.out.println("width=" + width + ",height=" + height + "."); + } + + + /** + * @param inputPath 源图片路径 + * @param outputPath 修改大小后图片路径 + * @param scaleSize 图片的修改比例,目标宽度 + */ + public static void resizeImage(String inputPath, String outputPath,int scaleSize) throws IOException { + + File srcFile = new File(inputPath); + Image srcImg = ImageIO.read(srcFile); + BufferedImage bi = null; + try { + bi = ImageIO.read(srcFile); + } catch (Exception e) { + e.printStackTrace(); + } + float width = bi.getWidth(); // 像素 + float height = bi.getHeight(); // 像素 + float scale = width/scaleSize; + BufferedImage buffImg = null; + buffImg = new BufferedImage(scaleSize, (int)(height/scale), BufferedImage.TYPE_INT_RGB); + //使用TYPE_INT_RGB修改的图片会变色 + buffImg.getGraphics().drawImage( + srcImg.getScaledInstance(scaleSize, (int)(height/scale), Image.SCALE_SMOOTH), 0, + 0, null); + + ImageIO.write(buffImg, "JPEG", new File(outputPath)); + } + + /** + * 改变图片DPI + * + * @param file + * @param xDensity + * @param yDensity + */ + public static void handleDpi(File file, int xDensity, int yDensity) { + try { + BufferedImage image = ImageIO.read(file); + JPEGImageEncoder jpegEncoder = JPEGCodec.createJPEGEncoder(new FileOutputStream(file)); + JPEGEncodeParam jpegEncodeParam = jpegEncoder.getDefaultJPEGEncodeParam(image); + jpegEncodeParam.setDensityUnit(JPEGEncodeParam.DENSITY_UNIT_DOTS_INCH); + jpegEncoder.setJPEGEncodeParam(jpegEncodeParam); + jpegEncodeParam.setQuality(0.1f, false); + jpegEncodeParam.setXDensity(xDensity); + jpegEncodeParam.setYDensity(yDensity); + jpegEncoder.encode(image, jpegEncodeParam); + image.flush(); + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/cc/mrbird/febs/mall/test/getGray.java b/src/main/java/cc/mrbird/febs/mall/test/getGray.java new file mode 100644 index 0000000..6b9815b --- /dev/null +++ b/src/main/java/cc/mrbird/febs/mall/test/getGray.java @@ -0,0 +1,51 @@ +package cc.mrbird.febs.mall.test; + +import javax.imageio.ImageIO; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.awt.image.RenderedImage; +import java.io.File; +import java.io.IOException; + +public class getGray { + + /** + * 将输入的图片转换成灰度图片 + * @param bufferedImage_start + * @return + */ + public static BufferedImage gray(BufferedImage bufferedImage_start){ //定义灰度方法 返回值为BufferedImage对象 + int width = bufferedImage_start.getWidth(); + int height =bufferedImage_start.getHeight(); + BufferedImage bufferedImage_end = new BufferedImage(width,height, BufferedImage.TYPE_3BYTE_BGR ); //构建新的对象模型 + // 遍历图片的RGB值,把得到的灰度值存到bufferedImage_end中,然后返回bufferedImage_end + for (int y = 0; y < height; y++) { + for (int x = 0; x < width; x++) { + + int pixel = bufferedImage_start.getRGB(x, y); + int[] rgb = new int[3]; //分别表示红绿蓝RGB。 + rgb[0] = pixel >> 16 & 0xff; + rgb[1] = pixel >> 8 & 0xff; + rgb[2] = pixel & 0xff; + int gray = (rgb[0] * 28 + rgb[1] * 151 + rgb[2] * 77) >> 8; + +// Color color = new Color(bufferedImage_start.getRGB(x,y));//构建Color获取图片像素点 +// int gray = (int)(color.getRed() * 0.2126 + color.getGreen() * 0.7152 + color.getBlue() * 0.0722); + Color color_end = new Color(gray,gray,gray); //将设置的像素设置到bufferedImage_end + bufferedImage_end.setRGB(x,y,color_end.getRGB()); + } + } + return bufferedImage_end; + } + + public static void main(String[] args) { + try{ + RenderedImage rendImage =gray(ImageIO.read(new File("D:\\image\\inputDpi.png"))); + File file = new File("D:\\image\\outDpi.png"); + ImageIO.write(rendImage, "png", file); + }catch(IOException e){ + System.out.println(e); + } + } + +} diff --git a/src/main/java/cc/mrbird/febs/mall/test/imageTest.java b/src/main/java/cc/mrbird/febs/mall/test/imageTest.java new file mode 100644 index 0000000..6458e9c --- /dev/null +++ b/src/main/java/cc/mrbird/febs/mall/test/imageTest.java @@ -0,0 +1,100 @@ +package cc.mrbird.febs.mall.test; + +import com.sun.image.codec.jpeg.JPEGCodec; +import com.sun.image.codec.jpeg.JPEGEncodeParam; +import com.sun.image.codec.jpeg.JPEGImageEncoder; + +import javax.imageio.ImageIO; +import javax.swing.*; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.awt.image.ConvolveOp; +import java.awt.image.Kernel; +import java.awt.image.RenderedImage; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +public class imageTest { + + public static void main(String[] args) throws IOException { + +// File originalImage = new File("D:\\image\\out.png"); +// try{ +// RenderedImage rendImage =getGray.gray(ImageIO.read(new File("D:\\image\\input.png"))); +// ImageIO.write(rendImage, "png", originalImage); +// }catch(IOException e){ +// System.out.println(e); +// } + + + + File originalImage = new File("D:\\image\\input.png"); + System.out.println("源文件大小" + originalImage.length()); + File resizedImg1 = new File("D:\\image\\out3.png"); + resize(originalImage, resizedImg1, Integer.parseInt(Long.toString(originalImage.length())), 0.1f); + System.out.println("0.1转换后文件大小" + resizedImg1.length()); + + } +// ## 遍历文件夹下图片批量压缩 +// public static void main(String[] args) throws IOException { +// File folder = new File("C:\\Users\\Win\\Desktop\\faceImages");//文件夹路径 +// File[] listOfFiles = folder.listFiles(); +// for (int i = 0; i < listOfFiles.length; i++) { +// if (listOfFiles[i].isFile()) { +// File originalImage = listOfFiles[i]; +// System.out.println("源文件大小" + originalImage.length()); +// String fileName = originalImage.getName(); +// File resizedImg1 = new File("C:\\Users\\Win\\Desktop\\productImages\\" + fileName); +// resize(originalImage, resizedImg1, 64, 0.9f); +// System.out.println(fileName + "0.8转换后文件大小" + resizedImg1.length()); +// } else if (listOfFiles[i].isDirectory()) { +// System.out.println("Directory " + listOfFiles[i].getName()); +// } +// } +// +// +// } + + /** + * 缩放图片(压缩图片质量,改变图片尺寸) + * 若原图宽度小于新宽度,则宽度不变! + * @param newWidth 新的宽度 + * @param quality 图片质量参数 0.7f 相当于70%质量 + */ + public static void resize(File originalFile, File resizedFile, int newWidth, float quality) throws IOException { + if (quality > 1) { + } + ImageIcon ii = new ImageIcon(originalFile.getCanonicalPath()); + Image i = ii.getImage(); + Image resizedImage = null; + int iWidth = i.getWidth(null); + int iHeight = i.getHeight(null); + if (iWidth < newWidth) { + newWidth = iWidth; + } + if (iWidth > iHeight) { + resizedImage = i.getScaledInstance(newWidth, (newWidth * iHeight) / iWidth, Image.SCALE_SMOOTH); + } else { + resizedImage = i.getScaledInstance((newWidth * iWidth) / iHeight, newWidth, Image.SCALE_SMOOTH); + } + Image temp = new ImageIcon(resizedImage).getImage(); + BufferedImage bufferedImage = new BufferedImage(temp.getWidth(null), temp.getHeight(null), BufferedImage.TYPE_INT_RGB); + Graphics g = bufferedImage.createGraphics(); + g.setColor(Color.white); + g.fillRect(0, 0, temp.getWidth(null), temp.getHeight(null)); + g.drawImage(temp, 0, 0, null); + g.dispose(); + float softenFactor = 0.05f; + float[] softenArray = {0, softenFactor, 0, softenFactor, 1 - (softenFactor * 4), softenFactor, 0, softenFactor, 0}; + Kernel kernel = new Kernel(3, 3, softenArray); + ConvolveOp cOp = new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP, null); + bufferedImage = cOp.filter(bufferedImage, null); + FileOutputStream out = new FileOutputStream(resizedFile); + JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out); + JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(bufferedImage); + param.setQuality(quality, true); + encoder.setJPEGEncodeParam(param); + encoder.encode(bufferedImage); + } +} -- Gitblit v1.9.1