package major;
import java.awt.Graphics2D;
import java.awt.color.ColorSpace;
import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
import java.awt.image.ColorConvertOp;
import java.awt.image.ColorModel;
import java.awt.image.MemoryImageSource;
import java.awt.image.PixelGrabber;
/**
 * 
 * 鍥惧儚杩囨护,澧炲己OCR璇嗗埆鎴愬姛鐜?
 * 
 */
public class ImageFilter {
	private BufferedImage image;
	private int iw, ih;
	private int[] pixels;
	public ImageFilter(BufferedImage image) {
		this.image = image;
		iw = image.getWidth();
		ih = image.getHeight();
		pixels = new int[iw * ih];
	}
	/** 鍥惧儚浜屽?鍖?*/
	public BufferedImage changeGrey() {
		PixelGrabber pg = new PixelGrabber(image.getSource(), 0, 0, iw, ih, pixels, 0, iw);
		try {
			pg.grabPixels();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		// 璁惧畾浜屽?鍖栫殑鍩熷?锛岄粯璁ゅ?涓?00
		int grey = 100;
		// 瀵瑰浘鍍忚繘琛屼簩鍊煎寲澶勭悊锛孉lpha鍊间繚鎸佷笉鍙?
		ColorModel cm = ColorModel.getRGBdefault();
		for (int i = 0; i < iw * ih; i++) {
			int red, green, blue;
			int alpha = cm.getAlpha(pixels[i]);
			if (cm.getRed(pixels[i]) > grey) {
				red = 255;
			} else {
				red = 0;
			}
			if (cm.getGreen(pixels[i]) > grey) {
				green = 255;
			} else {
				green = 0;
			}
			if (cm.getBlue(pixels[i]) > grey) {
				blue = 255;
			} else {
				blue = 0;
			}
			pixels[i] = alpha << 24 | red << 16 | green << 8 | blue;
		}
		// 灏嗘暟缁勪腑鐨勮薄绱犱骇鐢熶竴涓浘鍍?
		return ImageIOHelper.imageProducerToBufferedImage(new MemoryImageSource(iw, ih, pixels, 0, iw));
	}
	/** 鎻愬崌娓呮櫚搴?杩涜閿愬寲 */
	public BufferedImage sharp() {
		PixelGrabber pg = new PixelGrabber(image.getSource(), 0, 0, iw, ih, pixels, 0, iw);
		try {
			pg.grabPixels();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		// 璞$礌鐨勪腑闂村彉閲?
		int tempPixels[] = new int[iw * ih];
		for (int i = 0; i < iw * ih; i++) {
			tempPixels[i] = pixels[i];
		}
		// 瀵瑰浘鍍忚繘琛屽皷閿愬寲澶勭悊锛孉lpha鍊间繚鎸佷笉鍙?
		ColorModel cm = ColorModel.getRGBdefault();
		for (int i = 1; i < ih - 1; i++) {
			for (int j = 1; j < iw - 1; j++) {
				int alpha = cm.getAlpha(pixels[i * iw + j]);
				// 瀵瑰浘鍍忚繘琛屽皷閿愬寲
				int red6 = cm.getRed(pixels[i * iw + j + 1]);
				int red5 = cm.getRed(pixels[i * iw + j]);
				int red8 = cm.getRed(pixels[(i + 1) * iw + j]);
				int sharpRed = Math.abs(red6 - red5) + Math.abs(red8 - red5);
				int green5 = cm.getGreen(pixels[i * iw + j]);
				int green6 = cm.getGreen(pixels[i * iw + j + 1]);
				int green8 = cm.getGreen(pixels[(i + 1) * iw + j]);
				int sharpGreen = Math.abs(green6 - green5) + Math.abs(green8 - green5);
				int blue5 = cm.getBlue(pixels[i * iw + j]);
				int blue6 = cm.getBlue(pixels[i * iw + j + 1]);
				int blue8 = cm.getBlue(pixels[(i + 1) * iw + j]);
				int sharpBlue = Math.abs(blue6 - blue5) + Math.abs(blue8 - blue5);
				if (sharpRed > 255) {
					sharpRed = 255;
				}
				if (sharpGreen > 255) {
					sharpGreen = 255;
				}
				if (sharpBlue > 255) {
					sharpBlue = 255;
				}
				tempPixels[i * iw + j] = alpha << 24 | sharpRed << 16 | sharpGreen << 8 | sharpBlue;
			}
		}
		// 灏嗘暟缁勪腑鐨勮薄绱犱骇鐢熶竴涓浘鍍?
		return ImageIOHelper.imageProducerToBufferedImage(new MemoryImageSource(iw, ih, tempPixels, 0, iw));
	}
	/** 涓?婊ゆ尝 */
	public BufferedImage median() {
		PixelGrabber pg = new PixelGrabber(image.getSource(), 0, 0, iw, ih, pixels, 0, iw);
		try {
			pg.grabPixels();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		// 瀵瑰浘鍍忚繘琛屼腑鍊兼护娉紝Alpha鍊间繚鎸佷笉鍙?
		ColorModel cm = ColorModel.getRGBdefault();
		for (int i = 1; i < ih - 1; i++) {
			for (int j = 1; j < iw - 1; j++) {
				int red, green, blue;
				int alpha = cm.getAlpha(pixels[i * iw + j]);
				// int red2 = cm.getRed(pixels[(i - 1) * iw + j]);
				int red4 = cm.getRed(pixels[i * iw + j - 1]);
				int red5 = cm.getRed(pixels[i * iw + j]);
				int red6 = cm.getRed(pixels[i * iw + j + 1]);
				// int red8 = cm.getRed(pixels[(i + 1) * iw + j]);
				// 姘村钩鏂瑰悜杩涜涓?婊ゆ尝
				if (red4 >= red5) {
					if (red5 >= red6) {
						red = red5;
					} else {
						if (red4 >= red6) {
							red = red6;
						} else {
							red = red4;
						}
					}
				} else {
					if (red4 > red6) {
						red = red4;
					} else {
						if (red5 > red6) {
							red = red6;
						} else {
							red = red5;
						}
					}
				}
				// int green2 = cm.getGreen(pixels[(i - 1) * iw + j]);
				int green4 = cm.getGreen(pixels[i * iw + j - 1]);
				int green5 = cm.getGreen(pixels[i * iw + j]);
				int green6 = cm.getGreen(pixels[i * iw + j + 1]);
				// int green8 = cm.getGreen(pixels[(i + 1) * iw + j]);
				// 姘村钩鏂瑰悜杩涜涓?婊ゆ尝
				if (green4 >= green5) {
					if (green5 >= green6) {
						green = green5;
					} else {
						if (green4 >= green6) {
							green = green6;
						} else {
							green = green4;
						}
					}
				} else {
					if (green4 > green6) {
						green = green4;
					} else {
						if (green5 > green6) {
							green = green6;
						} else {
							green = green5;
						}
					}
				}
				// int blue2 = cm.getBlue(pixels[(i - 1) * iw + j]);
				int blue4 = cm.getBlue(pixels[i * iw + j - 1]);
				int blue5 = cm.getBlue(pixels[i * iw + j]);
				int blue6 = cm.getBlue(pixels[i * iw + j + 1]);
				// int blue8 = cm.getBlue(pixels[(i + 1) * iw + j]);
				// 姘村钩鏂瑰悜杩涜涓?婊ゆ尝
				if (blue4 >= blue5) {
					if (blue5 >= blue6) {
						blue = blue5;
					} else {
						if (blue4 >= blue6) {
							blue = blue6;
						} else {
							blue = blue4;
						}
					}
				} else {
					if (blue4 > blue6) {
						blue = blue4;
					} else {
						if (blue5 > blue6) {
							blue = blue6;
						} else {
							blue = blue5;
						}
					}
				}
				pixels[i * iw + j] = alpha << 24 | red << 16 | green << 8 | blue;
			}
		}
		// 灏嗘暟缁勪腑鐨勮薄绱犱骇鐢熶竴涓浘鍍?
		return ImageIOHelper.imageProducerToBufferedImage(new MemoryImageSource(iw, ih, pixels, 0, iw));
	}
	/** 绾挎?鐏板害鍙樻崲 */
	public BufferedImage lineGrey() {
		PixelGrabber pg = new PixelGrabber(image.getSource(), 0, 0, iw, ih, pixels, 0, iw);
		try {
			pg.grabPixels();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		// 瀵瑰浘鍍忚繘琛岃繘琛岀嚎鎬ф媺浼革紝Alpha鍊间繚鎸佷笉鍙?
		ColorModel cm = ColorModel.getRGBdefault();
		for (int i = 0; i < iw * ih; i++) {
			int alpha = cm.getAlpha(pixels[i]);
			int red = cm.getRed(pixels[i]);
			int green = cm.getGreen(pixels[i]);
			int blue = cm.getBlue(pixels[i]);
			// 澧炲姞浜嗗浘鍍忕殑浜害
			red = (int) (1.1 * red + 30);
			green = (int) (1.1 * green + 30);
			blue = (int) (1.1 * blue + 30);
			if (red >= 255) {
				red = 255;
			}
			if (green >= 255) {
				green = 255;
			}
			if (blue >= 255) {
				blue = 255;
			}
			pixels[i] = alpha << 24 | red << 16 | green << 8 | blue;
		}
		// 灏嗘暟缁勪腑鐨勮薄绱犱骇鐢熶竴涓浘鍍?
		return ImageIOHelper.imageProducerToBufferedImage(new MemoryImageSource(iw, ih, pixels, 0, iw));
	}
	/** 杞崲涓洪粦鐧界伆搴﹀浘 */
	public BufferedImage grayFilter() {
		ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_GRAY);
		ColorConvertOp op = new ColorConvertOp(cs, null);
		return op.filter(image, null);
	}
	/** 骞虫粦缂╂斁 */
	public BufferedImage scaling(double s) {
		AffineTransform tx = new AffineTransform();
		tx.scale(s, s);
		AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_BILINEAR);
		return op.filter(image, null);
	}
	public BufferedImage scale(Float s) {
		int srcW = image.getWidth();
		int srcH = image.getHeight();
		int newW = Math.round(srcW * s);
		int newH = Math.round(srcH * s);
		// 鍏堝仛姘村钩鏂瑰悜涓婄殑浼哥缉鍙樻崲
		BufferedImage tmp=new BufferedImage(newW, newH, image.getType()); 
		Graphics2D g= tmp.createGraphics(); 
		for (int x = 0; x < newW; x++) {
			g.setClip(x, 0, 1, srcH);
			// 鎸夋瘮渚嬫斁缂?
			g.drawImage(image, x - x * srcW / newW, 0, null);
		}
		// 鍐嶅仛鍨傜洿鏂瑰悜涓婄殑浼哥缉鍙樻崲
		BufferedImage dst = new BufferedImage(newW, newH, image.getType()); 
		g = dst.createGraphics();
		for (int y = 0; y < newH; y++) {
			g.setClip(0, y, newW, 1);
			// 鎸夋瘮渚嬫斁缂?
			g.drawImage(tmp, 0, y - y * srcH / newH, null);
		}
		return dst;
	}
}
 最近下载更多
最近下载更多
                
                huang163zi     LV1
                2023年4月25日
            
            
        
                dengjunjun     LV15
                2023年3月26日
            
            
        
                yymftanghui     LV2
                2022年3月4日
            
            
        
                Chillax     LV1
                2021年12月2日
            
            
        
                shijinbiao2006     LV3
                2021年8月4日
            
            
        
                OrangeACE     LV1
                2021年3月2日
            
            
        
                yangyang11111111     LV1
                2020年10月26日
            
            
        
                Vicent250     LV1
                2020年8月6日
            
            
        
                htx1984     LV3
                2020年2月23日
            
            
        
                houliukou     LV38
                2020年2月17日
            
            
         最近浏览更多
最近浏览更多
                
                nhxzyx    
                2024年6月28日
            
            
                    暂无贡献等级
            
        
                3334004690     LV11
                2024年6月22日
            
            
        
                huang163zi     LV1
                2023年4月25日
            
            
        
                dengjunjun     LV15
                2023年3月26日
            
            
        
                harrison123     LV2
                2022年5月10日
            
            
        
                ruishent     LV6
                2022年3月9日
            
            
        
                502595347     LV1
                2022年1月13日
            
            
        
                Chillax     LV1
                2021年12月1日
            
            
        
                mlfreeman3    
                2021年10月11日
            
            
                    暂无贡献等级
            
        
                whfuai     LV14
                2021年8月19日
            
            
        
 
     
                 
                