需要帮助删除我的java图形代码中的异常吗

需要帮助删除我的java图形代码中的异常吗,java,swing,graphics2d,Java,Swing,Graphics2d,我正在swing中开发一个应用程序,它有5个选项卡,在图像上有以下5个操作:无操作、颜色转换、仿射变换、卷积和查找 代码如下: 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

我正在swing中开发一个应用程序,它有5个选项卡,在图像上有以下5个操作:无操作、颜色转换、仿射变换、卷积和查找

代码如下:

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.ConvolveOp;
import java.awt.image.Kernel;
import java.awt.image.LookupOp;
import java.awt.image.LookupTable;
import java.awt.image.ShortLookupTable;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTabbedPane;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;


public class ImageProcessing extends JFrame{
BufferedImage source;
public static void main(String args[])
{
    try {
         UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel");
    } catch (Exception e1){e1.printStackTrace();}
    SwingUtilities.invokeLater(new Runnable(){public void run(){new ImageProcessing();}});
}

public ImageProcessing() {
    // TODO Auto-generated constructor stub
    super("Image Processing");
    setSize(600,400);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    try
    {
        source=ImageIO.read(new File("src/abc.jpg"));
    }catch(IOException e){System.out.println("Exception Here :"+e);}

    JTabbedPane jtp=new JTabbedPane();
    buildNoOpTab(jtp);
    buildAffineTransformOpTab(jtp);
    buildColorConvertOpTab(jtp);
    buildConvolveOpTab(jtp);
    buildLookUpOpTab(jtp);
    //buildRescaleOpTab(jtp);

    add(jtp);
    setVisible(true);

}
private void buildNoOpTab(JTabbedPane jtp)
{
    jtp.add("No Op",new JLabel(new ImageIcon(source)));
}
private void buildAffineTransformOpTab(JTabbedPane jtp)
{
    BufferedImage dst;
    AffineTransform transform=AffineTransform.getScaleInstance(0.5, 0.5);
    AffineTransformOp op=new AffineTransformOp(transform, AffineTransformOp.TYPE_BILINEAR);
    dst=op.filter(source, null);
    jtp.add("AffineTransform",new JLabel(new ImageIcon(dst)));
}
private void buildColorConvertOpTab(JTabbedPane jtp)
{
    BufferedImage dst = null;
    ColorSpace clr=ColorSpace.getInstance(ColorSpace.CS_GRAY);
    ColorConvertOp op=new ColorConvertOp(clr,null);
    dst=op.filter(source,dst);
    jtp.add("Color Convert",new JLabel(new ImageIcon(dst)));
}
 private void buildConvolveOpTab(JTabbedPane jtp) {
        BufferedImage dst = null;
        float sharpen[] = new float[] {
             0.0f, -1.0f,  0.0f,
            -1.0f,  5.0f, -1.0f,
             0.0f, -1.0f,  0.0f
        };
        Kernel kernel = new Kernel(3, 3, sharpen);
        ConvolveOp op = new ConvolveOp(kernel);
        dst = op.filter(source, null);

        jtp.add("Convolve", new JLabel(new ImageIcon(dst)));
    }
 private void buildLookUpOpTab(JTabbedPane jtp)
 {
     BufferedImage dst=null;
     short[] data=new short[256];
     for(int i=0;i<256;i++)
         data[i]=(short)(255-i);
     LookupTable lkp=new ShortLookupTable(0,data);
     LookupOp op=new LookupOp(lkp,null);
     dst=op.filter(source, null);
     jtp.add("Look Up",new JLabel(new ImageIcon(dst)));
}


}
导入java.awt.color.ColorSpace;
导入java.awt.geom.AffineTransform;
导入java.awt.image.AffineTransformOp;
导入java.awt.image.buffereImage;
导入java.awt.image.ColorConvertOp;
导入java.awt.image.ConvolveOp;
导入java.awt.image.Kernel;
导入java.awt.image.LookupOp;
导入java.awt.image.LookupTable;
导入java.awt.image.ShortLookupTable;
导入java.io.File;
导入java.io.IOException;
导入javax.imageio.imageio;
导入javax.swing.ImageIcon;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JTabbedPane;
导入javax.swing.SwingUtilities;
导入javax.swing.UIManager;
公共类ImageProcessing扩展了JFrame{
缓冲图像源;
公共静态void main(字符串参数[])
{
试一试{
UIManager.setLookAndFeel(“javax.swing.plaf.nimbus.NimbusLookAndFeel”);
}catch(异常e1){e1.printStackTrace();}
调用器(new Runnable(){public void run(){new ImageProcessing();}});
}
公共图像处理(){
//TODO自动生成的构造函数存根
超级(“图像处理”);
设置大小(600400);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
尝试
{
source=ImageIO.read(新文件(“src/abc.jpg”);
}catch(IOException e){System.out.println(“这里的异常:+e);}
JTabbedPane jtp=新JTabbedPane();
联合战术基地(jtp);
buildAffineTransformOpTab(jtp);
buildColorConvertOpTab(jtp);
构建卷积OPTAB(jtp);
buildLookUpOpTab(jtp);
//构建重缩放选项卡(jtp);
添加(jtp);
setVisible(真);
}
私有void buildNoOpTab(JTabbedPane jtp)
{
jtp.add(“无操作”,新JLabel(新图像图标(源));
}
私有void buildAffineTransformOpTab(JTabbedPane jtp)
{
缓冲图像dst;
仿射变换=仿射变换.getScaleInstance(0.5,0.5);
AffineTransformOp=新的AffineTransformOp(变换,AffineTransformOp.TYPE_双线性);
dst=op.filter(源,空);
jtp.add(“仿射变换”,新JLabel(新图像图标(dst));
}
私有void buildColorConvertOpTab(JTabbedPane jtp)
{
BuffereImage dst=null;
ColorSpace clr=ColorSpace.getInstance(ColorSpace.CS_GRAY);
ColorConvertOp=新的ColorConvertOp(clr,null);
dst=op.filter(源,dst);
添加(“颜色转换”,新JLabel(新图像图标(dst));
}
私有void buildConvolveOpTab(JTabbedPane jtp){
BuffereImage dst=null;
浮动锐化[]=新浮动[]{
0.0f,-1.0f,0.0f,
-1.0f,5.0f,-1.0f,
0.0f,-1.0f,0.0f
};
内核=新内核(3,3,锐化);
ConvolveOp=新的ConvolveOp(内核);
dst=op.filter(源,空);
jtp.add(“卷积”,新JLabel(新图像图标(dst));
}
专用void buildLookUpOpTab(JTabbedPane jtp)
{
BuffereImage dst=null;
short[]数据=新的short[256];

对于(int i=0;i,
LookupOp.filter
方法说明:

对BuffereImage执行查找操作。如果源映像中的颜色模型与目标映像中的颜色模型不同,则将在目标映像中转换像素。如果目标映像为null,将使用适当的颜色模型创建BuffereImage。如果numLookupTable中数组的ber不满足上述类注释中所述的限制,或者如果源映像具有IndexColorModel。

由于您正在过滤使用
ImageIO.read
创建的
BuffereImage
,因此图像的颜色模型肯定不会是IndexColorModel,因为
JPEGImageReader
(实际上是从文件创建了BufferdImage)不支持
IndexColorModel
-在过去,JPEG使用
DirectColorModel

查看此线程中有关如何读取JPEG文件和使用不同颜色模型的答案:

在图像上使用任何过滤器之前,需要从图像中删除alpha通道。要使代码正常工作,请更改:

try
    {
        source=ImageIO.read(new File("src/abc.jpg"));
    } catch(IOException e){System.out.println("Exception Here :"+e);}
为此:

 try
    {
        BufferedImage src = ImageIO.read(new File("abc.jpg"));
        int w = src.getWidth();
        int h = src.getHeight();
        source = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
        Raster raster = src.getRaster().createChild(0, 0, w, h, 0, 0, 
            new int[] {0, 1, 2});
        source.setData(raster);
    }catch(IOException e){System.out.println("Exception Here :"+e);}

上面的代码在
RGB
模式下创建一个新的缓冲图像,并将原始图像的
RGB
数据设置为新的缓冲图像,忽略
alpha
值。但如果原始图像包含完全透明的斑点,则它将成为新缓冲图像中的黑点。

哪一行代码引发此异常Option?换句话说,哪一行是ImageProcessing.java:108?ImageProcessing是我的类名。实际上没有这样的行号108。我的完整代码是102行。你的异常状态不同。它告诉你这一行:
ImageProcessing.buildLookUpOpTab(ImageProcessing.java:108)
,ImageProcessing.java类的第108行是引发异常的地方。请尝试重新运行代码以查看行号是否已更改。如果未更改,请获取一个合适的文本编辑器程序并尝试为我们查找第108行。很可能是这一行:
dst=op.filter(source,null);
。请查找API以了解此情况,因为它将准确地告诉您何时引发此异常以及原因。@HoverCraftFullOfels:您说得对。再次运行108将更改为97,该行为“”“”“dst=op.filter(source,null)“那么我能做些什么来获得索引颜色模型呢?”@Naveen阅读一下我在答案中发布的帖子上的答案。
 try
    {
        BufferedImage src = ImageIO.read(new File("abc.jpg"));
        int w = src.getWidth();
        int h = src.getHeight();
        source = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
        Raster raster = src.getRaster().createChild(0, 0, w, h, 0, 0, 
            new int[] {0, 1, 2});
        source.setData(raster);
    }catch(IOException e){System.out.println("Exception Here :"+e);}