解决java Graphics drawImage 无法显示图片的问题

目录
  • java Graphics drawImage无法显示图片
    • 解决方案:总结为两个问题
  • drawImage()第一次调用图片不成功
    • 解决方案:把所有图片都加载一次
    • 解决方案:使用MediaTracker类

java Graphics drawImage无法显示图片

package com.sitech.test;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;

import javax.swing.ImageIcon;
import javax.swing.JComponent;
import javax.swing.JFrame;

public class ImageTest {
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
JFrame frame = new ImageFrame();
frame.setTitle("sasdas");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
});
}
}
class ImageFrame extends JFrame
{
public ImageFrame()
{
add(new ImageComponent());
pack();
} 

}
class ImageComponent extends JComponent
{
private static final int DEFAULT_WIDTH =800;
private static final int DEFAULT_HEIGHT = 800;
private Image image;
public ImageComponent()
{
    String path = "com/sitech/test/111.jpg";
image= new ImageIcon(ClassLoader.getSystemResource(path)).getImage();// 通过这种方式加载图片 

}
public void paintComponent(Graphics g)
{
    Graphics2D g2 = (Graphics2D)g;
if(image==null)return;

int imageWidth = image.getWidth(this);
int imageHeight = image.getHeight(this);

g2.drawImage(image,0,0,this);//这种方式 

for(int i =0 ;i*imageWidth<= getWidth();i++)
    for(int j = 0 ;j*imageHeight<=getHeight();j++)
	if(i+j>0)
	    g2.copyArea(0, 0, imageWidth, imageHeight,i*imageWidth,j*imageHeight);
}
public Dimension getPreferredSize(){return new Dimension(DEFAULT_WIDTH,DEFAULT_HEIGHT);}
}

这里是我测试使用 drawImage 的时候使用的测试用例,遇到无法显示图片的问题

解决方案:总结为两个问题

第一个问题:

String path = "com/sitech/test/111.jpg";
image= new ImageIcon(ClassLoader.getSystemResource(path)).getImage();
//通过这种方式加载图片

上面这种方式加载图片 才能正常获取到图片(不清楚原因)

第二个问题:

g2.drawImage(image,0,0,this);
//这种方式 最后一个参数使用 this 才能在第一次运行时 显示图片,之前我使用的是null

但是第一次运行都无法显示图片,debug 查看已经获取到了图片,但是就是无法显示,我通过改变frame的大小,导致自动repaint,才显示了图片,通过百度有说将最后一个参数使用this可以显示,尝试后果然可以,但是不明白为什么可以,先mark一下吧

drawImage()第一次调用图片不成功

下边的代码在第一次使用图片时图片可能会显示不出来,drawImage()函数返回false

    public void paint(Graphics g) {
        g.drawImage(imagesBomb[count], x, y, null)
        count++;
        if (count >= 42) {
            this.life = false;
        }
    }

解决方案:把所有图片都加载一次

    public void paint(Graphics g) {
        if(!g.drawImage(imagesBomb[count], x, y, null)){
            for (int i = 0; i < 43; i++) {
                g.drawImage(imagesBomb[i], -1000, -1000, null);
            }
            g.drawImage(imagesBomb[count], x, y, null);
        }
        count++;
        if (count >= 42) {
            this.life = false;
        }
    }

资料

我Applet中不断调用一个函数

该函数中用Graphics::drawImage显示图片,如下示

在开始的一段时间内返回值b经常会是false,导致显示不正常,这是为什么?有什么办法解决确保在开始的一段时间内也正常显示呢?

但是,只要显示一段时间后,即该函数被调用若干次后返回值b就会一直是true,再也不会返回false了。

当drawImage这个方法中的图片没有被完全加载的时候,这个方法会返回false。

drawImage方法是在调用的时候才加载所需要的图片,所以第一次调用的时候,图片没有被完全加载,造成显示的不正常,甚至不显示图片,此后,图片由于方法调用被加载,以后再以这幅图片为参数的时候,就可以正常显示了。

解决方案:使用MediaTracker类

Image img = Toolkit.getDefaultToolkit().getImage(imgPath);
MediaTracker t = new MediaTracker(this);
t.addImage(img, 0);
t.waitForAll();

将这段代码在drawImage()之前调用,MediaTracker可以确保你的图片在DRAW前被加载以备使用。

通过addImage方法加入一个Image并符上一个ID号,waitForAll()等待加入的所有图片被加载完毕。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • java 使用ImageIO.writer从BufferedImage生成jpeg图像遇到问题总结及解决

    java 使用ImageIO.writer从BufferedImage生成jpeg图像遇到问题总结及解决 生成jpeg图像这是个非常非常简单的东西了,网上很多介绍是直接用com.sun.image.codec.jpeg.JPEGImageEncoder来实现,如下: /** * 将原图压缩生成jpeg格式的数据 * @param source * @return */ public static byte[] wirteJPEGBytes(BufferedImage source){ if(nu

  • SpringMVC生成的验证码图片不显示问题及解决方法

    近期用SSM框架写一个项目,登录模块需要生成验证码图片,我把相关的代码写好了之后传到 jsp ,但是图片不显示,查看控制台显示404,反复查询了一下代码并没有发现任何问题,代码如下: @Controller public class ValidateCodeController { private static final long serialVersionUID = 1L; private static int WIDTH = 70; // 验证码图片的宽度 private static i

  • Java Swing实现窗体添加背景图片的2种方法详解

    本文实例讲述了Java Swing实现窗体添加背景图片的2种方法.分享给大家供大家参考,具体如下: 在美化程序时,常常需要在窗体上添加背景图片.通过搜索和测试,发现了2种有效方式.下面分别介绍. 1. 利用JLabel加载图片 利用JLabel自带的setIcon(Icon icon)加载icon,并设置JLabel对象的位置和大小使其完全覆盖窗体.这是一个很取巧的办法,代码非常简单,如下所示. JLabel lbBg = new JLabel(imageIcon); lbBg.setBound

  • 解决java Graphics drawImage 无法显示图片的问题

    目录 java Graphics drawImage无法显示图片 解决方案:总结为两个问题 drawImage()第一次调用图片不成功 解决方案:把所有图片都加载一次 解决方案:使用MediaTracker类 java Graphics drawImage无法显示图片 package com.sitech.test; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.Graphics; import ja

  • 微信小程序canvas.drawImage完全显示图片问题的解决

    问题描述 问题产生 对于微信小程序,canvas处理过程中,dramImage默认图片引用是有残缺的 导入初始项目 打开链接(原官网例子),浏览器唤醒微信开发这工具,打开连接之前需要下载好微信开发者工具,如已安装则直接唤起,没有则会提示下载 目的 通过对canvas绘图过程的修改,或者其样式的修改,达到完全显示,并自适应不同机型的目的 解决方案 准备工作 Page({ data:{ imgSrc: '', // 需要处理图片地址 imgW: '', // canvas 宽度 imgH: '',

  • 以Spring Boot的方式显示图片或下载文件到浏览器的示例代码

    以Java web的方式显示图片到浏览器以Java web的方式下载服务器文件到浏览器 以Spring Boot的方式显示图片或下载文件到浏览器 请求例子:http://localhost:8080/image/1564550185144.jpeg 示例代码: import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.R

  • Graphics.DrawImage绘制的图像变大的原因分析及解决

    目录 Graphics.DrawImage绘制的图像变大 原因分析 解决方案 C#Graphics.DrawImage的一些问题 Graphics.DrawImage绘制的图像变大 原因分析 DrawImage是设备相关的函数,换言之就是,DrawImage会把屏幕的参数带上,所以,它绘制图像的DPI基本都是96.而我的图片是72DPI的. 例如,假定一个 Image 对象的宽度为 216 像素而存储的水平分辨率值为 72 点/英寸.因为 216 除以 72 等于 3,所以 DrawImage

  • Java Servlet上传图片到指定文件夹并显示图片

    在学习Servlet过程中,针对图片上传做了一个Demo,实现的功能是:在a页面上传图片,点击提交后,将图片保存到服务器指定路径(D:/image):跳转到b页面,b页面读取展示绝对路径(D:/image)的图片.主要步骤如下: 步骤一:上传页面uploadphoto.jsp 需要注意两个问题: 1.form 的method必须是post的,get不能上传文件, 还需要加上enctype="multipart/form-data" 表示提交的数据是二进制文件. 2.需要提供type=&

  • Java Struts图片上传至指定文件夹并显示图片功能

    继上一次利用Servlet实现图片上传,这次利用基于MVC的Struts框架,封装了Servlet并简化了JSP页面跳转. JSP上传页面 上传一定要为form加上enctype="multipart/form-data",表示提交的数据时二进制的 并且必须是method="post" <%@ page language="java" contentType="text/html; charset=utf-8" page

  • 微信小程序 解决swiper不显示图片的方法

    微信小程序 解决swiper不显示图片的方法 1.我说的swiper不显示图片是只有一个swiper的框,但不显示设置好的图片. 第一个要确定的是图片路径设置的正不正确,确定路径没有设置错,还有一个可能的原因就是,放swiper的这个页面(也就是这个wxml文件)没有在app.json里面的pages进行注册 确决的方法是: 找到项目下的app.json文件 在app.json的配置文件下的pages进行页面注册,像下面图片这样 小程序的文档也写了"小程序中新增/减少页面,都需要对 pages

  • java和javascript中过滤掉img形式的字符串不显示图片的方法

    本文实例讲述了java和javascript中过滤掉img形式的字符串不显示图片的方法.分享给大家供大家参考.具体实现方法如下: 1. javascript过滤掉<img></img>和<img />形式的字符串 复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml

  • 移动端页面在ios中不显示图片的解决方法

    在移动端开发中,有的时候可能遇到这样的问题,我从别人网站上下载下来的图片,然后做出H5页面,但是在浏览器中和android中都显示正常,可是一到ios中图片就不显示了,这个时候就需要注意了,可能是图片的格式问题导致ios中不认识,比如我从网上下载的图片保存到电脑中不能预览的图片就是这种. 在计算机中打开预览图片显示如下: 这样的图片在ios中就不显示,解决办法很简单,就是在下载的时候去掉后面的类型就可以了, 以上这篇移动端页面在ios中不显示图片的解决方法就是小编分享给大家的全部内容了,希望能给

  • Laravel框架之解决前端显示图片问题

    最近做项目,功能是在用户上传图片成功后显示该图片,在本地测试(WAMP环境)下正常显示,但是部署到服务器上(LNMP)下无法显示. 因为LNMP环境下域名直接指向Laravel框架下的public目录,public为Laravel框架唯一对外公开的文件夹,而我的图片保存在storage/images,无法直接访问.查了官网文档发现可以在Linux下建立文件软链接,但试了以后没成功(可能是我打开的方式不对).而且这样做在WAMP下又不能显示图片了 最后,还是决定将图片保存在public/image

随机推荐