如何使用Java缩放和显示图像的特定部分

时间:2013-09-01 18:54:06

标签: java image swing

所以我自己学习Java。 对于Elipse的每次崩溃,我都会后悔更多的决定。 幸运的是,我实际上已经设法让我自己造成的这个项目实际上“工作”,但显然是自学,我很确定我在布局中犯了很多错误

总的来说,程序将创建一个JFrame,然后在其中插入一个JPanel(wrapPage)的JscrollPane。然后,它循环生成一个TMTile对象数组的进程,这些对象是包含从jpg图像的源文件夹中提取的图块图像的扩展JPanel。完成之后,使用wrapPage Jpanel中的GridBagLayout将该数组放置为网格,从而形成一个漂亮的小完美迷宫。

这一切都很完美,但最重要的是,用于制作瓷砖的图像大小决定了一切。我不能为我的生活弄清楚如何缩放图像和努力找到一个合适的过程只有我创建新图像文件的方法或拉伸和平铺图像之间的交替,以适应其包含的组件或建议我只是无法效仿拯救我的生命。

幸运。图像处理是TMTile类文件的一部分!这意味着我可以向您展示脚本的全部相关内容;

导入以下内容以在此文件中使用

来自java.awt的

:Color,GridBagConstraints,GridBagLayout,Insets
来自javax.swing:ImageIcon,JLabel,JPanel

public class TMTile extends JPanel
{
private static final long serialVersionUID = 1L;

private int paths; // values 0 to 15, uses bitwise & | to set or check open paths

private JLabel tileWrap; // to contain the ImageIcon
private ImageIcon tileImg; // the image to be used

GridBagConstraints bag;

public TMTile( int inDir ) // called by maze constructor
{
    paths = inDir;
    this.setBackground( Color.RED ); // so I can tell if the image didn't load right
    this.setLayout( new GridBagLayout() ); // GridBagLayout is probably overkill but it what I am most familiar with now.

    bag = new GridBagConstraints();
    bag.insets = new Insets( 0, 0, 0, 0 );

    tileImg = tileImage( paths );

    tileWrap = new JLabel( "", tileImg, JLabel.CENTER );

    this.add( tileWrap, bag );
}


public void open( int inDir ) // called by maze constructor when tile value changes resulting from the perfect maze backtrack method
{
    paths = paths | inDir;

    tileImg = tileImage( paths );

    tileWrap.setIcon( tileImg );
}


private ImageIcon tileImage( int paths ) // created to cut down on duplicate code and make updating easier
{
    String inEnd;

    if(paths < 10)
    {
        inEnd = "0"+ paths;
    }
    else
    {
        inEnd = ""+ paths;
    }

    ImageIcon tileImg = new ImageIcon( "imgs/MAZE_"+ inEnd +".jpg" );

    System.out.println( "imgs/MAZE_"+ inEnd +".jpg" );

    Image newimg = tileImg.getImage().getScaledInstance( 40, 40, java.awt.Image.SCALE_DEFAULT );

    tileImg = new ImageIcon( newimg );

    return tileImg;
}


public int getOpen()
{
    return paths;
}
}

感谢nachokk和MadProgrammer,我现在再次拥有一个工作迷宫程序,迷宫瓷砖是可扩展的。这样做的最终目的就是取消单个tile .jpgs并切换到单个图像文件,其中所有16个存储在其中。

我希望能够使用单个大图像文件,该文件分为16个部分,每个图块值为1个部分。我开始朝着这个目标努力,但不得不放弃它,因为我无法弄清楚如何只显示所需的图像部分,这也需要按照上述方式进行缩放。

由于我仍然非常喜欢学习任何替代方案的Java建议,但理想情况下我很想知道如何按计划完成此任务。

0 个答案:

没有答案