From 84599f1fdac0d9723c7f02a2e66b0e909ad911d7 Mon Sep 17 00:00:00 2001 From: KKSU <15274802129@163.com> Date: Thu, 30 May 2024 09:44:11 +0800 Subject: [PATCH] 图片上传 --- src/main/java/cc/mrbird/febs/mall/test/FingerPrint.java | 634 ++++++++++---------- src/main/java/cc/mrbird/febs/mall/test/PixelateImage.java | 190 +++--- src/main/java/cc/mrbird/febs/mall/test/ImageToChar.java | 292 ++++---- src/main/java/cc/mrbird/febs/mall/test/getGray.java | 102 +- pom.xml | 10 src/main/java/cc/mrbird/febs/mall/test/DYDelMark.java | 324 +++++----- src/main/java/cc/mrbird/febs/mall/test/imageTest.java | 194 +++--- 7 files changed, 873 insertions(+), 873 deletions(-) diff --git a/pom.xml b/pom.xml index 8f21dc9..1002b06 100644 --- a/pom.xml +++ b/pom.xml @@ -29,11 +29,11 @@ <dependencies> - <dependency> - <groupId>com.madgag</groupId> - <artifactId>animated-gif-lib</artifactId> - <version>1.4</version> - </dependency> +<!-- <dependency>--> +<!-- <groupId>com.madgag</groupId>--> +<!-- <artifactId>animated-gif-lib</artifactId>--> +<!-- <version>1.4</version>--> +<!-- </dependency>--> <dependency> <groupId>org.web3j</groupId> diff --git a/src/main/java/cc/mrbird/febs/mall/test/DYDelMark.java b/src/main/java/cc/mrbird/febs/mall/test/DYDelMark.java index 945de93..3328eeb 100644 --- a/src/main/java/cc/mrbird/febs/mall/test/DYDelMark.java +++ b/src/main/java/cc/mrbird/febs/mall/test/DYDelMark.java @@ -1,162 +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; - } - } -} +//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 index 788a348..a73b2f8 100644 --- a/src/main/java/cc/mrbird/febs/mall/test/FingerPrint.java +++ b/src/main/java/cc/mrbird/febs/mall/test/FingerPrint.java @@ -1,317 +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)); - } - -} +//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 index ea4d0a2..76354a9 100644 --- a/src/main/java/cc/mrbird/febs/mall/test/ImageToChar.java +++ b/src/main/java/cc/mrbird/febs/mall/test/ImageToChar.java @@ -1,156 +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); +//package cc.mrbird.febs.mall.test; // -// ImageIO.write(buffImg, "jpg", new File("D:\\image\\gif\\"+i+".png")); +//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(); // } -// }catch(IOException e){ -// System.out.println(e); +// 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) { - // 存放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(); +// /** +// * 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.out.println(e); +// System.err.println("合成gif图失败"); // } // } - - /** - * 将图片转换成字符串 - * @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); -// } -// } -} +// +// /** +// * 将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 index a1d2709..150d765 100644 --- a/src/main/java/cc/mrbird/febs/mall/test/PixelateImage.java +++ b/src/main/java/cc/mrbird/febs/mall/test/PixelateImage.java @@ -1,95 +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(); - } - } -} +//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 index 6b9815b..5de6809 100644 --- a/src/main/java/cc/mrbird/febs/mall/test/getGray.java +++ b/src/main/java/cc/mrbird/febs/mall/test/getGray.java @@ -1,51 +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); - } - } - -} +//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 index 6458e9c..821c5ef 100644 --- a/src/main/java/cc/mrbird/febs/mall/test/imageTest.java +++ b/src/main/java/cc/mrbird/febs/mall/test/imageTest.java @@ -1,100 +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()); -// } -// } +//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()); // // } - - /** - * 缩放图片(压缩图片质量,改变图片尺寸) - * 若原图宽度小于新宽度,则宽度不变! - * @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); - } -} +//// ## 遍历文件夹下图片批量压缩 +//// 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