【问题标题】:viewing images using SWT使用 SWT 查看图像
【发布时间】:2011-10-18 04:57:54
【问题描述】:

我正在尝试使用 SWT 制作图像查看器,我想在画布上显示图像。单击“下一步”按钮时,我希望画布上的图像更改为所选文件夹中的下一个图像。进一步,我想通过使用 xml 文件中存在的矩形边界在此图像上绘制矩形。我该如何实现?请帮助

【问题讨论】:

    标签: xml image canvas swt viewer


    【解决方案1】:

    这是一个简单的代码(应该增强以正确的纵横比缩小图像等。;])

    import java.io.IOException;
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.util.Random;
    
    import org.eclipse.swt.SWT;
    import org.eclipse.swt.events.PaintEvent;
    import org.eclipse.swt.events.PaintListener;
    import org.eclipse.swt.events.SelectionAdapter;
    import org.eclipse.swt.events.SelectionEvent;
    import org.eclipse.swt.graphics.Color;
    import org.eclipse.swt.graphics.Image;
    import org.eclipse.swt.graphics.RGB;
    import org.eclipse.swt.graphics.Rectangle;
    import org.eclipse.swt.layout.FillLayout;
    import org.eclipse.swt.widgets.Button;
    import org.eclipse.swt.widgets.Composite;
    import org.eclipse.swt.widgets.Display;
    import org.eclipse.swt.widgets.Shell;
    
    public class ImageLoader {
    
        private Display display = null;
        private Shell shell = null;
        private Composite imageCanvas = null;
        private Image img = null;
        private Random random = new Random();
        private Color rectColor = null;
    
        private String[] imageURLs = new String[] {
                "http://upload.wikimedia.org/wikipedia/en/7/70/Example.png",
                "http://upload.wikimedia.org/wikipedia/commons/thumb/1/19/APEC_Police_Helicopter%2C_Opera_House%2C_2_Sept_2007.JPG/220px-APEC_Police_Helicopter%2C_Opera_House%2C_2_Sept_2007.JPG",
                "http://upload.wikimedia.org/wikipedia/commons/thumb/a/a2/Abroad_-_1882.djvu/page13-474px-Abroad_-_1882.djvu.jpg"
            };
        private int imgNum = 0;
        private Rectangle[] rectangles = null;
    
        public ImageLoader() {
            display = new Display();
            shell = new Shell(display);
            shell.setLayout(new FillLayout());
            shell.setSize(700, 500);
    
            rectColor = new Color(display, new RGB(255, 0, 0));
    
            // load first image which should be displayed
            loadImage();
    
            imageCanvas = new Composite(shell, SWT.BORDER);
            // on each paint event (first view, window resize, redraw method, ...) make my code
            imageCanvas.addPaintListener(new PaintListener() {
    
                @Override
                public void paintControl(PaintEvent e) {
                    // draw the image from (0,0) in it's own size
                    e.gc.drawImage(img, 0, 0);
    
                    // set foreground color (paint color)
                    e.gc.setForeground(rectColor);
                    // draw all loaded rectangles
                    for(int i = 0; i < rectangles.length; i++) e.gc.drawRectangle(rectangles[i]);
                }
            });
    
            Button btnNext = new Button(shell, SWT.PUSH);
            btnNext.setText("Next image");
            btnNext.addSelectionListener(new SelectionAdapter() {
    
                @Override
                public void widgetSelected(SelectionEvent e) {
                    // load next image
                    loadImage();
                    // repaint image canvas
                    imageCanvas.redraw();
                }
    
            });
    
    //      shell.pack();
            shell.open();
            while (!shell.isDisposed()) {
                if (!display.readAndDispatch())
                    display.sleep();
            }
    
            rectColor.dispose();
        }
    
        /**
         * Loads next image from folder
         */
        private void loadImage() {
            try {
                img = new Image(display, getImageURL().openStream());
            } catch (IOException ex) {
                ex.printStackTrace();
            }
    
            // read rectangles which should be shown
            rectangles = new Rectangle[random.nextInt(5) + 3];
            for(int i = 0; i < rectangles.length; i++) rectangles[i] = getRectangleFromFile();
        }
    
        /**
         * Fakes loading next image from folder by cycling on image array
         * @return
         */
        private URL getImageURL() {
            URL tmpURL;
            try {
                tmpURL = new URL(imageURLs[imgNum]);
            } catch (MalformedURLException e) {
                e.printStackTrace();
                return null;
            }
            // in the end? let's turn back on start
            if(++imgNum >= imageURLs.length) imgNum = 0;
            return tmpURL;
        }
    
        /**
         * Fakes reading rectangles from file by generating random size and position rectangle
         * @return
         */
        private Rectangle getRectangleFromFile() {
            return new Rectangle(random.nextInt(img.getBounds().width), random.nextInt(img.getBounds().height), random.nextInt(50), random.nextInt(50));
        }
    
        public static void main(String[] args) {
            new ImageLoader();
        }
    }
    

    【讨论】:

    • 非常感谢。代码运行良好。我必须进行一些更改,因为我不使用 url 而是使用文件。有没有办法通过使用文件中的文件来执行相同的操作系统上存在的目录?我知道目录的路径。我是 SWT 新手。所以我需要帮助
    • 检查javadoc for SWT Image,顶部有图像加载示例和您可以使用的其他构造函数..
    • 我在我的代码中使用了一个画布小部件。一切正常。但是图像相互重叠。如果先打开一个更大的图像,而下一个图像是一个小图像,那么较大的图像在较小的图像下方。这可能是因为我使用了画布。我该怎么办?
    • 没有任何代码很难解决,提出新问题并将代码发布在其中。最好是SSCCE
    猜你喜欢
    • 1970-01-01
    • 2012-08-12
    • 1970-01-01
    • 2020-06-30
    • 1970-01-01
    • 2014-06-07
    • 1970-01-01
    • 1970-01-01
    • 2016-03-19
    相关资源
    最近更新 更多