Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从图像中删除任意方向的线_Java_Image Processing - Fatal编程技术网

Java 如何从图像中删除任意方向的线

Java 如何从图像中删除任意方向的线,java,image-processing,Java,Image Processing,基本上,我希望删除可能覆盖文本的行,例如那些通常在验证码文本图像中找到的行,因此后图像仅包含文本。任何关于如何解决这个问题的建议都将不胜感激 您想编辑现有的captcha图像生成器(这将很难,因为它可能与特定的captcha实现有关,并且您没有在此处披露实现代码),还是想生成新的captcha(看起来平滑干净,没有重叠文本) 下面是我为JSP web应用程序页面创建自己的验证码时所做的。您必须删除JSP导入语句,并用JAVA导入语句替换它。如果需要,您可以自由编辑代码并生成自己的验证码(编辑图形

基本上,我希望删除可能覆盖文本的行,例如那些通常在验证码文本图像中找到的行,因此后图像仅包含文本。任何关于如何解决这个问题的建议都将不胜感激

您想编辑现有的captcha图像生成器(这将很难,因为它可能与特定的captcha实现有关,并且您没有在此处披露实现代码),还是想生成新的captcha(看起来平滑干净,没有重叠文本)

下面是我为JSP web应用程序页面创建自己的验证码时所做的。您必须删除JSP导入语句,并用JAVA导入语句替换它。如果需要,您可以自由编辑代码并生成自己的验证码(编辑图形)。希望这有帮助

<%@ page import="java.util.*"%>
<%@ page import="java.io.*"%>
<%@ page import="javax.servlet.*"%>
<%@ page import="javax.servlet.http.*"%>
<%@ page import="java.awt.*"%>
<%@ page import="java.awt.image.*"%>
<%@ page import="javax.imageio.*"%>
<%@ page import="java.awt.geom.*"%>
<%
   response.setContentType("image/jpg");

  try {

        Color backgroundColor = Color.green;
        Color borderColor = Color.orange;
        Color textColor = Color.white;
        Color circleColor = Color.green;
        Font textFont = new Font("Arial", Font.PLAIN, 24);
        int charsToPrint = 6;
        int width = request.getParameter("width") != null ? Integer.parseInt(request.getParameter("width")) : 150;
        int height = request.getParameter("height") != null ? Integer.parseInt(request.getParameter("height")) : 80;
        int circlesToDraw = 6;
        float horizMargin = 20.0f;
        float imageQuality = 0.95f; // max is 1.0 (this is for jpeg)
        double rotationRange = 0.7; // this is radians
        BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

        Graphics2D g = (Graphics2D) bufferedImage.getGraphics();

        //Draw an oval
        g.setColor(Color.DARK_GRAY);
        g.fillRect(0, 0, width, height);

        // lets make some noisey circles
        g.setColor(circleColor);
        for ( int i = 0; i < circlesToDraw; i++ ) {
             int circleRadius = (int) (Math.random() * height / 2.0);
             int circleX = (int) (Math.random() * width - circleRadius);
             int circleY = (int) (Math.random() * height - circleRadius);
             g.drawOval(circleX, circleY, circleRadius * 2, circleRadius * 2);
        }

        g.setColor(textColor);
        g.setFont(textFont);

        FontMetrics fontMetrics = g.getFontMetrics();
        int maxAdvance = fontMetrics.getMaxAdvance();
        int fontHeight = fontMetrics.getHeight();

        // i removed 1 and l and i because there are confusing to users...
        // Z, z, and N also get confusing when rotated
        // 0, O, and o are also confusing...
        // lowercase G looks a lot like a 9 so i killed it
        // this should ideally be done for every language...
        // i like controlling the characters though because it helps prevent confusion
        String elegibleChars = "ABCDEFGHJKLMPQRSTUVWXYabcdefhjkmnpqrstuvwxy23456789";
        char[] chars = elegibleChars.toCharArray();

        float spaceForLetters = -horizMargin * 2 + width;
        float spacePerChar = spaceForLetters / (charsToPrint - 1.0f);

        AffineTransform transform = g.getTransform();

        StringBuffer finalString = new StringBuffer();

        for ( int i = 0; i < charsToPrint; i++ ) {
            double randomValue = Math.random();
            int randomIndex = (int) Math.round(randomValue * (chars.length - 1));
            char characterToShow = chars[randomIndex];
            finalString.append(characterToShow);

            // this is a separate canvas used for the character so that
            // we can rotate it independently
            int charImageWidth = maxAdvance * 2;
            int charImageHeight = fontHeight * 2;
            int charWidth = fontMetrics.charWidth(characterToShow);
            int charDim = Math.max(maxAdvance, fontHeight);
            int halfCharDim = (int) (charDim / 2);

            BufferedImage charImage = new BufferedImage(charDim, charDim, BufferedImage.TYPE_INT_ARGB);
            Graphics2D charGraphics = charImage.createGraphics();
            charGraphics.translate(halfCharDim, halfCharDim);
            double angle = (Math.random() - 0.5) * rotationRange;
            charGraphics.transform(AffineTransform.getRotateInstance(angle));
            charGraphics.translate(-halfCharDim,-halfCharDim);
            charGraphics.setColor(textColor);
            charGraphics.setFont(textFont);

            int charX = (int) (0.5 * charDim - 0.5 * charWidth);
            charGraphics.drawString("" + characterToShow, charX,(int) ((charDim - fontMetrics.getAscent()) / 2 + fontMetrics.getAscent()));

            float x = horizMargin + spacePerChar * (i) - charDim / 2.0f;
            int y = (int) ((height - charDim) / 2);

            g.drawImage(charImage, (int) x, y, charDim, charDim, null, null);

            charGraphics.dispose();
        }

        //Write the image as a jpg
        Iterator iter = ImageIO.getImageWritersByFormatName("JPG");
        if( iter.hasNext() ) {
            ImageWriter writer = (ImageWriter)iter.next();
            ImageWriteParam iwp = writer.getDefaultWriteParam();
            iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
            iwp.setCompressionQuality(imageQuality);
            writer.setOutput(ImageIO.createImageOutputStream(response.getOutputStream()));
            IIOImage imageIO = new IIOImage(bufferedImage, null, null);
            writer.write(null, imageIO, iwp);
        } else {
            throw new RuntimeException("no encoder found for jsp");
        }

        // let's stick the final string in the session (optional, only if you use JSP session object, and want to save it inside the user session)
        session.setAttribute("captcha", finalString.toString());

        g.dispose();
    }
    catch (IOException ioe) {
            throw new RuntimeException("Unable to build image" , ioe);
    }
%>


它非常特定于特定的实现。文字和线条有不同的笔划宽度吗?实际上相反-我在探索OCR:)。