2015-08-06 3 views
1

Я работаю над шахматной игрой на Java. Я импортировал изображения на Eclipse, а затем назначал их ImageIcons, а затем назначал эти ImageIcons на кнопки для создания сетки.Java Icon Image Максимальный размер файла

В какой-то момент три из моих четырех изображений епископа не были назначены соответствующим кнопкам, поэтому я посмотрел размер файла, и выяснилось, что размеры трех изображений, которые не были назначены, были ~ 1,100 KB, ~ 1200 КБ и ~ 40 КБ. Изображение, которое было назначено кнопке, было около 25 КБ. Я думал, что это странно (особенно, поскольку все четыре изображения очень похожи), поэтому я экспортировал три проблемных изображения в более низком разрешении (все под 30 КБ), а затем снова импортировал их в Eclipse. Когда я снова запустил свою программу, они были назначены на правильные кнопки, и все прошло гладко.

Кнопки, которые я использую, имеют размер 75 х 75 пикселей, а пиксели для каждого изображения одинаковы (75 х 75), поэтому я смущен, почему это произошло. Я искал любые вопросы, связанные с этим, но я не мог найти их. Если кто-нибудь сможет объяснить, почему это может произойти со мной, это будет очень полезно, поэтому я могу избежать этой проблемы в будущем.

+0

Какой формат файлов вы используете для иконок? –

+1

* «Я думал, что это было странно (тем более, что все четыре изображения очень похожи)» * С помощью какой логической системы изображение с 1,1 МБ «похоже» на другое из 25 КБ? Почему на Земле большие большие? Один общий совет - использовать «ImageIO» для загрузки изображений - он даст намного больше ... обратной связи, если есть проблема. –

+0

@BinkanSalaryman Я использовал .jpg files –

ответ

0

Я рекомендую использовать png для прозрачных изображений и иконок, jpg для непрозрачных изображений - и только тогда, когда артефакты сжатия не имеют значения (lossless JPEG, к сожалению, не так широко распространен). bmp - один из худших форматов файлов, если дело доходит до размера файла. Как было предложено другим, загружать изображения в Java с ImageIO API:

public class Program { 
    public static void main(String[] args) { 
     InputStream imageSource = Program.class.getResourceAsStream("bishop"); // may be a URL, File or ImageInputStream instead 
     try { 
      BufferedImage bishopImage = ImageIO.read(imageSource); // read image 
      ImageIcon bishopIcon = new ImageIcon(bishopImage); // use adapter for Icon interface 
      System.out.println(bishopIcon); // do something with it 
     } catch (IOException e) { 
      e.printStackTrace(); // read failed 
     } 
    } 
} 
+0

Спасибо! Казалось, это сработало для меня. –

1

Я определенно загрузил изображения, которые намного больше, чем изображения в ImageIcons и другие компоненты, поэтому я подозреваю, что ваша проблема в том, что когда вы назначаете изображение в ImageIcon до того, как изображение будет полностью загружено. Вы можете использовать MediaTracker для решения этой проблемы. От ImageIcon:

/** * Loads an image into memory */ 
public static Image loadImage(String fn){ 
    try { 
    Image image=java.awt.Toolkit.getDefaultToolkit().createImage(fn); 
    MediaTracker tracker=new MediaTracker(lblForFM); tracker.addImage(image,0); 
    tracker.waitForID(0); 
    if (MediaTracker.COMPLETE != tracker.statusID(0,false)) throw new 
     IllegalStateException("Unable to load image from " + fn); 
    else return image; } catch (InterruptedException e) { 
     throw new RuntimeException("Interrupted while loading image from " + fn,e); 
    } 
} 
+1

Ssee также ['ImageIcon.setImageObserver (ImageObserver)'] (http://docs.oracle.com/javase/8/docs/api/javax/swing/ImageIcon.html#setImageObserver-java.awt.image.ImageObserver-) (но я по-прежнему предпочитаю «ImageIO», который блокирует пока изображение полностью загружено). –