Добавить TRUE в json_decode () возможно, но он будет обрабатывать все.
Вам нужно изменить доступ к переменным.
, если ваш json выглядит это:
$return = '{"status":"ok","message":"","code":"200","data":{"1234":{"sid":1,"name":"foo"},"4321":{"sid":2,"name":"bar"}}}';
on:
$json_data = json_decode($return, true);
$data = $json_data['data'];
вы можете закодировать данные $ и получить доступ к значениям в виде массива: $ data [0] ['name']. ..
on:
$json_data = json_decode($return);
$data = (array) $json_data->data;
вы можете закодировать $ data и получить доступ к значениям как объекты: $ data [0] -> name ...
Вот как я это делаю (немного больше информации о том, как загрузить изображение):
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.JPanel;
public class ImagePanel extends JPanel{
private BufferedImage image;
public ImagePanel() {
try {
image = ImageIO.read(new File("image name and path"));
} catch (IOException ex) {
// handle exception...
}
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(image, 0, 0, this); // see javadoc for more info on the parameters
}
}
Вы можете полностью откатить свой собственный подкласс Component, используя класс JXImagePanel из бесплатных библиотек SwingX .
Я думаю, что нет необходимости в подклассе чего-либо. Просто используйте Jlabel. Вы можете установить изображение в Jlabel. Итак, измените размер Jlabel, затем заполните его изображением. Все нормально. Так я и поступаю.
Этот ответ является дополнением к ответу @ shawalli ...
Я тоже хотел ссылаться на изображение в моей баночке, но вместо того, чтобы иметь BufferedImage, я просто сделал это:
JPanel jPanel = new JPanel();
jPanel.add(new JLabel(new ImageIcon(getClass().getClassLoader().getResource("resource/images/polygon.jpg"))));
Я могу видеть много ответов, не говоря уже о трех вопросах OP.
1) Слово о производительности: байт-массивы, скорее всего, неэффективны, если вы не можете использовать точный порядок байтов в пикселях, который соответствует текущее разрешение дисплея и глубина цвета.
Чтобы добиться наилучшего результата рисования, просто преобразуйте изображение в BufferedImage, который генерируется с типом, соответствующим вашей текущей графической конфигурации. См. CreateCompatibleImage в https://docs.oracle.com/javase/tutorial/2d/images/drawonimage.html
Эти изображения будут автоматически кэшироваться в памяти карты памяти после рисуя несколько раз без каких-либо усилий по программированию (это стандартно в Swing с Java 6), и поэтому фактический чертеж займет незначительное количество времени - , если вы не изменили изображение.
Изменение изображения будет сопровождаться дополнительной передачей памяти между основной памятью и памятью графического процессора - это медленно. Избегайте «перерисовывать» изображение в BufferedImage, поэтому избегайте делать getPixel и setPixel всеми способами.
Например, если вы разрабатываете игру, вместо того, чтобы рисовать всех участников игры в BufferedImage, а затем в JPanel, намного быстрее загружать всех участников как меньшие BufferedImages и нарисовать их по одному в вашем коде JPanel в правильном положении - таким образом, нет дополнительной передачи данных между основной памятью и памятью GPU, кроме начальной передачи изображений для кеширования.
ImageIcon будет использовать BufferedImage в капот - но в основном выделение BufferedImage с надлежащим графическим режимом является ключом, и нет никаких усилий, чтобы сделать это правильно.
2) Обычный способ сделать это для рисования BufferedImage в переопределенном методе paintComponent JPanel. Хотя Java поддерживает большое количество дополнительных преимуществ, таких как буферные цепочки, контролирующие VolatileImages, кэшированные в памяти GPU, нет необходимости использовать какие-либо из них, так как Java 6, которая делает достаточно хорошую работу, не подвергая все эти детали ускорения GPU.
Обратите внимание, что ускорение GPU может не работать для определенных операций, таких как растягивание полупрозрачных изображений.
3) Не добавлять. Просто нарисуйте его, как указано выше:
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(image, 0, 0, this);
}
«Добавление» имеет смысл, если изображение является частью макета. Если вам нужно это в качестве фона или переднего плана, заполняющего JPanel, просто нарисуйте paintComponent. Если вы предпочитаете заваривать общий компонент Swing, который может показывать ваше изображение, то это одна и та же история (вы можете использовать JComponent и переопределить свой метод paintComponent), а затем добавить этот в макет компонентов GUI .
4) Как преобразовать массив в Bufferedimage
Преобразование байт-массивов в PNG, а затем загрузка его довольно ресурсоемкая. Лучше всего преобразовать существующий массив байтов в BufferedImage.
Для этого: не использовать для циклов и копировать пиксели. Это очень медленно. Вместо этого:
Вы можете подклассировать JPanel - вот выдержка из моего ImagePanel, которая помещает изображение в любое из 5 местоположений: верхнее / левое, верхнее / правое, среднее / среднее, нижнее / левое или нижнее / правое:
protected void paintComponent(Graphics gc) {
super.paintComponent(gc);
Dimension cs=getSize(); // component size
gc=gc.create();
gc.clipRect(insets.left,insets.top,(cs.width-insets.left-insets.right),(cs.height-insets.top-insets.bottom));
if(mmImage!=null) { gc.drawImage(mmImage,(((cs.width-mmSize.width)/2) +mmHrzShift),(((cs.height-mmSize.height)/2) +mmVrtShift),null); }
if(tlImage!=null) { gc.drawImage(tlImage,(insets.left +tlHrzShift),(insets.top +tlVrtShift),null); }
if(trImage!=null) { gc.drawImage(trImage,(cs.width-insets.right-trSize.width+trHrzShift),(insets.top +trVrtShift),null); }
if(blImage!=null) { gc.drawImage(blImage,(insets.left +blHrzShift),(cs.height-insets.bottom-blSize.height+blVrtShift),null); }
if(brImage!=null) { gc.drawImage(brImage,(cs.width-insets.right-brSize.width+brHrzShift),(cs.height-insets.bottom-brSize.height+brVrtShift),null); }
}
Дорога Фреда Хаслама отлично работает. У меня были проблемы с файловой дорогой, хотя, поскольку я хочу ссылаться на изображение в моей банке. Для этого я использовал:
BufferedImage wPic = ImageIO.read(this.getClass().getResource("snow.png"));
JLabel wIcon = new JLabel(new ImageIcon(wPic));
Так как у меня есть только конечное число (около 10) изображений, которые мне нужно загрузить с использованием этого метода, он работает достаточно хорошо. Он получает файл без необходимости иметь правильный относительный путь к файлу.
ImageIcon
s. Для одного изображения я бы подумал о создании пользовательского подкласса JPanel
и переопределения его метода paintComponent
для рисования изображения. Вы можете избежать использования собственных Component
s и SwingX-библиотеки и класса ImageIO
:
File f = new File("hello.jpg");
JLabel imgLabel = new JLabel(new ImageIcon(file.getName()));
Если вы используете JPanels, то, вероятно, работают с Swing. Попробуйте следующее:
BufferedImage myPicture = ImageIO.read(new File("path-to-file"));
JLabel picLabel = new JLabel(new ImageIcon(myPicture));
add(picLabel);
Теперь изображение представляет собой компонент поворота. Он становится объектом условий компоновки, как и любой другой компонент.
Я делаю что-то очень похожее в частном проекте, над которым я работаю. До сих пор я сгенерировал изображения до 1024x1024 без каких-либо проблем (кроме памяти) и может отображать их очень быстро и без каких-либо проблем с производительностью.
Переопределение метода рисования подкласса JPanel является излишним и требует больше работы, чем вам нужно.
Как я это делаю:
Class MapIcon implements Icon {...}
ИЛИ
Class MapIcon extends ImageIcon {...}
Код, который вы используете для создания изображения, будет в этом классе. Я использую BufferedImage для рисования, а затем, когда вызывается paintIcon (), используйте g.drawImvge (bufferedImage); Это уменьшает количество мигания, выполняемое во время создания изображений, и вы можете его нарезать.
Далее я расширяю JLabel:
Class MapLabel extends Scrollable, MouseMotionListener {...}
Это потому, что я хочу поместить свое изображение на панель прокрутки, I.e. отобразите часть изображения и попросите пользователя прокрутить по мере необходимости.
Итак, я использую JScrollPane для хранения MapLabel, который содержит только MapIcon.
MapIcon map = new MapIcon ();
MapLabel mapLabel = new MapLabel (map);
JScrollPane scrollPane = new JScrollPane();
scrollPane.getViewport ().add (mapLabel);
Но для вашего сценария (просто покажите все изображение каждый раз). Вам необходимо добавить MapLabel в верхнюю часть JPanel и убедиться, что все они будут отображаться до полного размера изображения (путем переопределения GetPreferredSize ()).
JPanel
почти всегда является неправильным классом для подкласса. Почему бы вам не подкласс JComponent
?
Существует небольшая проблема с ImageIcon
в том, что конструктор блокирует чтение изображения. Не проблема при загрузке из приложения, но может быть, если вы потенциально читаете сетевое соединение. Существует много примеров использования AWT-времени MediaTracker
, ImageObserver
и друзей даже в демонстрациях JDK.
Создайте исходную папку в каталоге проекта, в этом случае я назвал ее «Изображения».
JFrame snakeFrame = new JFrame();
snakeFrame.setBounds(100, 200, 800, 800);
snakeFrame.setVisible(true);
snakeFrame.add(new JLabel(new ImageIcon("Images/Snake.png")));
snakeFrame.pack();