2014-07-16 2 views
1

Я знаю, что метод возвращает -1, когда он не может получить ширину или высоту изображения, но я надеюсь, что вы можете сказать мне, почему он не может справиться сделай это. Здесь я создаю несколько ImageIcons и сохранить их в массиве изображения:Java swing Изображение всегда имеет высоту и ширину -1

for(int x = 0; x < playerSprites.length; x++){ 
    playerSprites [x] = new ImageIcon("player" + x + ".png").getImage() 
} 

Позже я создаю экземпляр класса, который только создает этот массив в данный момент. Когда я тогда хочу, чтобы получить изображения из массива в другом классе проверить их высоту и ширину, и я всегда получаю -1 на оба:

public Image nextImage(String name){ 
    Image image = null; 
    if(name.equals("player")){ 
     if(counter == animationImageManager.getPlayerSprites().length-1){ 
      counter = 0; 
     } 
     image = animationImageManager.getPlayerSprites()[counter]; 
     counter++; 
    } 
    return image; 
} 
+0

«player» + x + «.png» вы знаете, что x является «int» здесь справа, а не строкой? – jhobbie

+0

Вы проверили, правильно ли они созданы при заполнении массива? – resueman

+0

@resueman Как бы вы это сделали. Когда я проверяю первый, он говорит imageFile = "player0.png", и у меня есть это изображение в том же пакете. –

ответ

2

Если изображение не найдено, то еще возвращать -1 по высоте и ширины.

Try ниже пример кода, чтобы воспроизвести проблему:

System.out.println(new ImageIcon("").getImage().getWidth(null)); // print -1 

Это стоит читать Java Учебник на Loading Images Using getResource


Может быть, это не загружая изображения должным образом.

Вы можете попробовать любой на основе местоположения изображения.

// Read from same package 
ImageIO.read(getClass().getResourceAsStream("c.png")); 

// Read from images folder parallel to src in your project 
ImageIO.read(new File("images/c.jpg")); 

// Read from src/images folder 
ImageIO.read(getClass().getResource("/images/c.png")) 

// Read from src/images folder 
ImageIO.read(getClass().getResourceAsStream("/images/c.png")) 

Read more...

+0

Второй пример не работал, потому что я получил исключение nullpointer. Изображения находятся в папке (res), параллельной src. Я не понимаю, потому что другие люди также сказали сделать это так. –

+0

, пожалуйста, поделитесь иерархией проектов (структурой), если это возможно. – Braj

+0

Как я уже говорил. Я выбрал, основываясь на местоположении, и это не сработало. –

1

Ширина/высота изображения будет возвращать -1, если изображение является недействительным. Когда нет изображения.

Предложения:

  • использование ImageIO.read(), который сгенерирует IOException если что-то пойдет не так с IO, как путь ошибиться.

  • Если изображение является ресурсом для вашего приложения, не читайте его как файл, прочитайте его как ресурс по URL-адресу. Например, если изображение находится в src/images, то вы могли бы сделать

    URL url = getClass().getResource("/images/myimage/png"); 
    BufferedImage image = ImageIO.read(url); 
    
  • Важно отметить, с ImageIcon будет, когда вы передаете строку в конструктор, он будет искать файл в локальной файловой системе. Он может работать, когда вы разрабатываете, но после развертывания приложения с изображениями в банке он больше не будет работать с файловым путем, потому что он больше не будет действительным. Вы можете передать URL-адрес ImageIcon так же, как указано выше, но, как я уже сказал, ImageIO позволяет обнаруживать больше ошибок.

  • Именно поэтому вы понимаете, что происходит в вашем текущем коде, указав только имя файла изображения в качестве пути к ImageIcon, поиск будет искать изображение в корне папки проекта (если вы хотите, re работает в среде IDE), потому что это рабочий каталог. Поэтому, если ваших изображений нет, изображения не будут найдены.

  • Еще одна вещь, которую следует отметить в отношении моей второй маркировки, - это поиск изображения. Вы можете увидеть путь, который я использовал "/images/myimage/png". Что делает / в начале, приводит поиск к корню из пути к классам, который в представлении разработки является src. Вызывающий класс обычно находится в некотором пакете на пути к классам, например com.hello.somepackage.SomeClass.Поэтому, если SomeClass пытается вызвать getREX getresource без /, поиск начнется с местоположения класса, находящегося в пакете.

Это лишь некоторые вещи, которые следует учитывать при использовании ресурсов/изображений. Но первые пара очков должны вас поймать.

Смежные вопросы