0

阿罗哈,

我无法在我的 java 代码中找到错误。在我看来,一切都很好且正确,但功能没有正确执行,我不明白为什么。该函数应检测颜色之间的差异并计算它们的算术平均值。它的泥土应该画在原图下面。我错过了什么,请帮帮我?

package edge;

import java.awt.Dimension;
import java.awt.FileDialog;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.image.MemoryImageSource;
import java.awt.image.PixelGrabber;
import javax.swing.JComponent;
import javax.swing.JFrame;

/**
*
* @author Alaska
*/
public class Edge extends JComponent {

final int W = 500;
final int H = 300;
Image m_TrgImg, m_SrcImg;

public Edge(JFrame father) {
    try {
        FileDialog diag = new FileDialog(father);
        diag.setVisible(true);
        m_SrcImg = getToolkit().getImage(diag.getDirectory() + diag.getFile()).getScaledInstance(W, H, Image.SCALE_SMOOTH);

        MediaTracker mt = new MediaTracker(this);
        mt.addImage(m_SrcImg, 0);
        mt.waitForAll();

        int[] srcPix = new int[W * H];
        int[] trgPix = new int[W * H];

        PixelGrabber grab = new PixelGrabber(m_SrcImg, 0, 0, W, H, srcPix, 0, W);
        grab.getPixels();

        MemoryImageSource imgProd = new MemoryImageSource(W, H, trgPix, 0, W);
        m_TrgImg = createImage(imgProd);
        detectEdges(srcPix, trgPix);
        m_TrgImg.flush();

    } catch (InterruptedException e) {
        System.out.println(e);
    }
}

@Override
public void paintComponent(Graphics g) {
    g.drawImage(m_SrcImg, 0, 0, this);
    g.drawImage(m_TrgImg, 0, H, this);
}

@Override
public Dimension getPreferredSize() {
    return getMinimumSize();
}

@Override
public Dimension getMinimumSize() {
    return new Dimension(W, H * 2);
}

private void detectEdges(int[] srcPix, int[] trgPix) {
    for (int x = 0; x < W; ++x) {
        for (int y = 0; y < H; ++y) {
            trgPix[y * W + x] = compColor(srcPix, x, y);
        }
    }
}

private int getRed(int col) {
    return (col >> 16) & 255;
}

private int getGreen(int col) {
    return (col >> 8) & 255;
}

private int getBlue(int col) {
    return col & 255;
}

private int compColor(int[] srcPix, int x, int y) {
    int red = 0;
    int green = 0;
    int blue = 0;
    int cnt = 0;
    final int IDX = y * W + x;
    final int RED = getRed(srcPix[IDX]);
    final int GREEN = getGreen(srcPix[IDX]);
    final int BLUE = getBlue(srcPix[IDX]);
    for (int dx = -1; dx <= 1; ++dx) {
        for (int dy = -1; dy <= 1; ++dy) {
            if (dx != 0 || dy != 0) {
                final int X = x + dx;
                final int Y = y + dy;
                final int LOCAL_IDX = Y * W + X;
                if (0 <= X && X < W && 0 <= Y && Y < H) {
                    ++cnt;
                    red   +=  Math.abs(RED -   getRed(srcPix[LOCAL_IDX]));
                    green +=  Math.abs(GREEN - getGreen(srcPix[LOCAL_IDX]));
                    blue  +=  Math.abs(BLUE -  getBlue(srcPix[LOCAL_IDX]));
                }
            }
        }
    }

    return 0xff000000 | (255 - (red / cnt) << 16) | (255 - (green / cnt) << 8) | (255 - (blue / cnt));
}

public static void main(String[] args) throws Exception {
    JFrame f = new JFrame();
    f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    f.getContentPane().add(new Edge(f));

    f.pack();
    f.setVisible(true);

} 
}
4

1 回答 1

0

你需要grab.grabPixels(),而不是grab.getPixels()。

http://docs.oracle.com/javase/7/docs/api/java/awt/image/PixelGrabber.html

还有垃圾神所说的关于初始线程的内容。您需要使用 SwingUtilities.invokeLater() 创建您的 GUI。

编辑

该方法正确执行,但您在输入上获得了所有黑色值,因为您的像素数组仅包含初始化值 0。

于 2013-10-18T22:19:11.147 回答