2013-03-03 40 views
1

CODE 1得到错误而产生的BufferedImage

/* 
    Java code for making the image grayscale, then binarizing it. 
*/ 
import javax.imageio.ImageIO; 
import java.awt.Color; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.lang.Object; 
import java.lang.*; 
import java.io.IOException; 
import javax.imageio.ImageIO; 
import java.lang.reflect.Field; 
import java.lang.reflect.ParameterizedType; 
import java.util.ArrayList; 
import java.util.List; 
public class lineremoval { 

    private static BufferedImage binarizedImage; 


    public static void main(String[] args) throws IOException { 

     File orignal_name = new File("photot.png"); 
     binarizedImage = ImageIO.read(orignal_name); 
     ExtractBeltsBasedonCoveredHeight(); 

     BufferedImage bmp = new BufferedImage(binarizedImage.getWidth(), binarizedImage.getHeight(),binarizedImage.getType()); 
     for(int i=0; i<binarizedImage.getWidth(); i++) { 
      for(int j=0; j<binarizedImage.getHeight(); j++) { 
       int red; 
       red = new Color(binarizedImage.getRGB(i,j)).getRed(); 
       int alpha = new Color(binarizedImage.getRGB(i,j)).getAlpha(); 
       int newPixel; 
       newPixel = colorToRGB(alpha, red,red,red); 
       bmp.setRGB(i, j, newPixel); 

      } 
     } 
     writeImage(bmp,0); 

    } 
    public static int FindBottomOfLine(BufferedImage bitmap, int topOfLine) 
    { 
     int x=0; 
     boolean no_black_pixel; 
     no_black_pixel = false; 
     int to_match; 
     while (no_black_pixel == false) 
     { 
      topOfLine++; 
      int white=new Color(bitmap.getRGB(0,0)).getRed(); 
      no_black_pixel = true; 
      for (x = 0; x < bitmap.getWidth() && topOfLine < bitmap.getHeight(); x++) 
      { 
       to_match = new Color(bitmap.getRGB(x,topOfLine)).getRed(); 
       if (to_match!=white) 
        no_black_pixel = false; 
      } 
     } 
     return topOfLine - 1; 
    } 
    public static int ExtractBeltsBasedonCoveredHeight() 
    { 
     int y = 0; 
     int x = 0; 
     boolean line_present = true; 
     ArrayList<Integer> line_top = new ArrayList<Integer>(1000); 
     ArrayList<Integer> line_bottom = new ArrayList<Integer>(1000); 
     while (line_present) 
     { 
      x = 0; 
      y = FindNextLine(binarizedImage, y, x); 
      if (y == -1) 
       break; 
      if (y >= binarizedImage.getHeight()) 
      { 
       line_present = false; 
      } 
      if (line_present) 
      { 
       line_top.add(y); 
       y = FindBottomOfLine(binarizedImage, y) + 1; 
       line_bottom.add(y); 
      } 
     } 

     return 1; 
    } 
    private static void writeImage(BufferedImage bmp,int number) throws IOException { 
     String strI = Integer.toString(number); 
     File file = new File("output"+strI+".png"); 
     try { 
        ImageIO.write(bmp, "png", file); 
      }catch(IOException e) { 
        System.out.println("Not worked"); 
      } 
      finally { 
        System.out.println("Works fine"); 
      } 

    } 
    private static int colorToRGB(int alpha, int red, int green, int blue) { 

     int newPixel = 0; 
     newPixel += alpha; 
     newPixel = newPixel << 8; 
     newPixel += red; newPixel = newPixel << 8; 
     newPixel += green; newPixel = newPixel << 8; 
     newPixel += blue; 

     return newPixel; 

    } 
    public static int FindNextLine(BufferedImage bitmap, int y,int x) 
    { 
     if (y >= bitmap.getHeight()) 
      return -1; 
     int white=new Color(bitmap.getRGB(0,0)).getRed(); 
     int to_match = new Color(bitmap.getRGB(x,y)).getRed(); 
     while (to_match==white) 
     { 

      x++; 
      if (x == bitmap.getWidth()) 
      { 
       x = 0; 
       y++; 
      } 
      if (y >= bitmap.getHeight()) 
      { 
       break; 
      } 
      to_match = new Color(bitmap.getRGB(x,y)).getRed(); 
     } 
     return y < bitmap.getHeight() ? y : -1; 
    } 

} 

CODE 2

import javax.imageio.ImageIO; 
    import java.awt.Color; 
    import java.awt.image.BufferedImage; 
    import java.io.File; 
    import java.lang.Object; 
    import java.lang.*; 
    import java.io.IOException; 
    import javax.imageio.ImageIO; 
    import java.lang.reflect.Field; 
    import java.lang.reflect.ParameterizedType; 
    import java.util.ArrayList; 
    import java.util.List; 
    public class lineremoval { 

     private static BufferedImage binarizedImage; 


     public static void main(String[] args) throws IOException { 

      File orignal_name = new File("photot.png"); 
      binarizedImage = ImageIO.read(orignal_name); 
      ExtractBeltsBasedonCoveredHeight(); 
     } 
     public static int FindBottomOfLine(BufferedImage bitmap, int topOfLine) 
     { 
      int x=0; 
      boolean no_black_pixel; 
      no_black_pixel = false; 
      int to_match; 
      while (no_black_pixel == false) 
      { 
       topOfLine++; 
       int white=new Color(bitmap.getRGB(0,0)).getRed(); 
       no_black_pixel = true; 
       for (x = 0; x < bitmap.getWidth() && topOfLine < bitmap.getHeight(); x++) 
       { 
        to_match = new Color(bitmap.getRGB(x,topOfLine)).getRed(); 
        if (to_match!=white) 
         no_black_pixel = false; 
       } 
      } 
      return topOfLine - 1; 
     } 
     public static int ExtractBeltsBasedonCoveredHeight() 
     { 
      int y = 0; 
      int x = 0; 
      boolean line_present = true; 
      ArrayList<Integer> line_top = new ArrayList<Integer>(1000); 
      ArrayList<Integer> line_bottom = new ArrayList<Integer>(1000); 
      while (line_present) 
      { 
       x = 0; 
       y = FindNextLine(binarizedImage, y, x); 
       if (y == -1) 
        break; 
       if (y >= binarizedImage.getHeight()) 
       { 
        line_present = false; 
       } 
       if (line_present) 
       { 
        line_top.add(y); 
        y = FindBottomOfLine(binarizedImage, y) + 1; 
        line_bottom.add(y); 
       } 
      } 


      BufferedImage bmp = new BufferedImage(binarizedImage.getWidth(), binarizedImage.getHeight(),binarizedImage.getType()); 
          for(int i=0; i<binarizedImage.getWidth(); i++) { 
          for(int j=0; j<binarizedImage.getHeight(); j++) { 
        int red; 
        red = new Color(binarizedImage.getRGB(i,j)).getRed(); 
        int alpha = new Color(binarizedImage.getRGB(i,j)).getAlpha(); 
        int newPixel; 
        newPixel = colorToRGB(alpha, red,red,red); 
        bmp.setRGB(i, j, newPixel); 

        } 
        } 
        writeImage(bmp,0); 


      return 1; 
     } 
     private static void writeImage(BufferedImage bmp,int number) throws IOException { 
      String strI = Integer.toString(number); 
      File file = new File("output"+strI+".png"); 
      try { 
        ImageIO.write(bmp, "png", file); 
      }catch(IOException e) { 
        System.out.println("Not worked"); 
      } 
      finally { 
        System.out.println("Works fine"); 
      } 

     } 
     private static int colorToRGB(int alpha, int red, int green, int blue) { 

      int newPixel = 0; 
      newPixel += alpha; 
      newPixel = newPixel << 8; 
      newPixel += red; newPixel = newPixel << 8; 
      newPixel += green; newPixel = newPixel << 8; 
      newPixel += blue; 

      return newPixel; 

     } 
     public static int FindNextLine(BufferedImage bitmap, int y,int x) 
     { 
      if (y >= bitmap.getHeight()) 
       return -1; 
      int white=new Color(bitmap.getRGB(0,0)).getRed(); 
      int to_match = new Color(bitmap.getRGB(x,y)).getRed(); 
      while (to_match==white) 
      { 

       x++; 
       if (x == bitmap.getWidth()) 
       { 
        x = 0; 
        y++; 
       } 
       if (y >= bitmap.getHeight()) 
       { 
        break; 
       } 
       to_match = new Color(bitmap.getRGB(x,y)).getRed(); 
      } 
      return y < bitmap.getHeight() ? y : -1; 
     } 

    } 

我想从包含段落的X线位图图像获取X的图像。 每个图像应该包含段落中的一行。为此,我使用了函数(“ExtractBeltsBasedonCoveredHeight”)来获取两个列表。在这些列表中,第i个元素表示段落(列表list_top和list_bottom中)中第i行的起始行号和结束行号。

获取这些值后,我无法从函数ExtractBeltsBasedonCoveredHeight创建图像。

我的代码1创建图像,而且码2给出了错误两种代码都是相同的,唯一的区别是在CODE2我呼吁从功能“ExtractBeltsBasedonCoveredHeight” writeImage和编码1我已经从主要功能

错误信息称为writeImage

lineremoval.java:86: error: unreported exception IOException; must be caught or declared to be thrown 
       writeImage(bmp,0); 
         ^
1 error 

回答

1

该消息是(像往常一样),告诉你什么是错的,如何解决它。您正在调用可能会调用IOException的代码,并且当您这样做时,必须要么抛出异常,要么将其捕获到try/catch块中。你最好的选择是检查例外教程,以了解如何执行这两个操作。

+0

但为什么我的code1工作。你说我的code2给出错误但不能抛出 – TLE 2013-03-03 07:40:30

+0

@ stranger001:看看调用'writeImage(...)'方法的方法。都抛出异常?你确定?你在任何地方捕捉它们吗? – 2013-03-03 07:42:29

+0

我的代码在writeImage函数中添加(try catch和finally)之后工作,但我仍然没有明白为什么我的code1在code2没有提供eroor的时候会出现问题。 – TLE 2013-03-03 08:00:56