Форум программистов, компьютерный форум, киберфорум
Java: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
0 / 0 / 0
Регистрация: 18.12.2014
Сообщений: 69

JScrollPanel для масштабирования изображения

29.12.2014, 20:00. Показов 1768. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Необходимо сделать масштабирование изображения. проблема в том, что когда изображение увеличивается, оно прорисовывается не полностью, а только та часть, которая влезает в экран. А нужно, что бы , если изображение не влезает-образовывались скроллы по бокам фрейма и при прокрутке их можно было бы увидеть то, что не вместилось. Скроллы появляются, а изображение не прорисовывается(( Методы, отвечающие за растяжение/сжатие изображения
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
private void Unzooming(){
        main=new Main();
        setImg(main.getGPanel().getBufferImg());
        actions=new RActions();
        System.out.println(startX+" "+startY);
        gr=getImg().createGraphics();
        double multiple = 0.5;
        int height = (int) (img.getHeight() * multiple);
        int width = (int) (img.getWidth() * multiple);
 
        Image im = img.getScaledInstance(width, height, Image.SCALE_SMOOTH);
 
        //Желательно бы заменить более функциональным, но на первое время сойдет
        gr.setColor(Color.WHITE);
        gr.fillRect(im.getWidth(main.getGPanel()),0,1200,720);
        gr.fillRect(0,im.getHeight(main.getGPanel()),1200,720);
 
        gr.drawImage(im, 0, 0, main.getGPanel());
        main.getGPanel().repaint();
        //graphPanel.setBufferSize(new Dimension(im.getWidth(main.getGPanel()), im.getHeight(main.getGPanel())));
       // graphPanel.setSize(new Dimension(im.getWidth(main.getGPanel()), im.getHeight(main.getGPanel())));
 
       // main.getGPanel().repaint();
        System.out.println("----");
    }
    private void Zooming(){
        main=new Main();
        actions=new RActions();
        System.out.println(startX+" "+startY);
        gr=getImg().createGraphics();
        double multiple = 2.0;
        int height = (int) (img.getHeight() * multiple);
        int width = (int) (img.getWidth() * multiple);
        graphPanel=main.getGPanel();
 
        Image im = img.getScaledInstance(width,height,Image.SCALE_SMOOTH);
 
        if(im.getHeight(main.getGPanel())>img.getHeight(main.getGPanel())){
 
            graphPanel.setSize(new Dimension(im.getWidth(main.getGPanel()),im.getHeight(main.getGPanel())));
 
            gr.drawImage(im,0,0,main.getGPanel());
            System.out.println("размер больше по вертикали");
         }
        if (im.getWidth(main.getGPanel())>img.getWidth(main.getGPanel())){
 
            System.out.println("размер больше по горизонтали");
            graphPanel.setSize(new Dimension(im.getWidth(main.getGPanel()),im.getHeight(main.getGPanel())));
            gr.drawImage(im,0,0,main.getGPanel());
 
         }
        main.getGPanel().repaint();
        gr.drawImage(im, 0, 0, main.getGPanel());
        System.out.println("++++");
    }
Класс, отвечающий за прорисовку изображения на буффере, а затем буффера на панели
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
package TestImportGraph;
 
/**
 * Создано 25.11.14
 */
 
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
 
 
public class GraphPanel extends JPanel {
       private Dimension size;
       private RActions actions;
       private static BufferedImage bufferImg;
       private GraphMetods graphMetods=new GraphMetods();
       private FigureFrame figureFrame=new FigureFrame();
       private static Graphics gr1;
       private ColorFrame colorFrame=new ColorFrame();
 
 
    int oldGraficMode;
    int oldDepth;
    boolean FillOn;
    Color oldColor;
        public void Init(){
          actions=new RActions();
          size = new Dimension(actions.getWidthComponent(), actions.getHeightComponent());
          bufferImg = doBufferImg(actions.getWidthComponent(),actions.getHeightComponent());
            // Это что бы система стирала фон.(При отсутсвии этой записи будут проблемы с краями изображения при изменении размеров окна
            this.setOpaque(false);
        }
        final BufferedImage doBufferImg(int canvasWidth, int canvasHeight) {
            BufferedImage img;
            Graphics gr;
 
            img = new BufferedImage(canvasWidth, canvasHeight, BufferedImage.TYPE_INT_ARGB);
 
            //Прорисовка белого фона на координатах от (0,0) до (1200,800)(задано в полях)
            gr=img.createGraphics();
            gr.setColor(Color.WHITE);
            gr.fillRect(0,0,getWidth(),getHeight());
            //
                if (bufferImg!= null) {
              // Получение наименьшей ширины и высоты.
                int minWidth = bufferImg.getWidth();
                minWidth = minWidth < canvasWidth ? minWidth : canvasWidth;//Если minWidth < canvasWidth, то minWidth=minWidth, иначе minWidth=canvasWidth
                int minHeight = bufferImg.getHeight();
                minHeight = minHeight < canvasHeight ? minHeight : canvasHeight;//Если minHeight < canvasHeight, то minHeight=minHeight, иначе minHeight=canvasHeight
               // Копирование изображения.
                img.setData(bufferImg.getData(new Rectangle(minWidth, minHeight)));
            }
            return img;
        }
        public BufferedImage getBufferImg() {
            return bufferImg;
        }
        public Dimension getBufferSize() {
            return size;
        }
        public int getBufferedWidth(){
            return bufferImg.getWidth();
        }
        public int getBufferedHeight(){
            return bufferImg.getHeight();
        }
        public void setBufferImg(BufferedImage bufImage){
            bufferImg=bufImage;
        }
        public Graphics getGraphicsPanel(){
            return gr1;
        }
        public void setBufferSize(Dimension canvasSize) {
            bufferImg=doBufferImg(canvasSize.width, canvasSize.height);
            size=canvasSize;
            revalidate();
            repaint();
        }
        @Override
            public Dimension getPreferredSize() {
                if (this.isPreferredSizeSet()) {
                    return super.getPreferredSize();
                }
            return size;
        }
        @Override
        public void paintComponent(Graphics gr) {
            if (bufferImg!=null) {
                gr.drawImage(bufferImg, 0, 0, this);
                gr1=gr;
 
            }
            try {
                if(oldGraficMode==graphMetods.getMode()&&FillOn==figureFrame.getFillOn()&&oldColor==colorFrame.getCustomColor()&&oldDepth==figureFrame.getDepth())
                graphMetods.ChoiceMode(colorFrame.getCustomColor(),(byte)2);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            oldGraficMode=graphMetods.getMode();
            FillOn=figureFrame.getFillOn();
            oldColor=colorFrame.getCustomColor();
            oldDepth=figureFrame.getDepth();
        }
}
Основной класс
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
public class Main{
    private GraphMetods graphMetods;
    private RecordToFile record;
    static JFrame frame;
    private RActions actions;
    private static GraphPanel graphPanel;
    private NorthPanel northPanel;
    private WestPanel westPanel;
    private static SouthPanel southPanel;
    //private JPanel SouthPanel_1;
    private JPanel EastPanel_1;
 
    public void InitPanel(){
        actions=new RActions();
        record=new RecordToFile();
        frame = new JFrame("testGraphRed");
        graphPanel = new GraphPanel();
        graphPanel.Init();
        EastPanel_1=new JPanel();
 
        northPanel=new NorthPanel();
        westPanel=new WestPanel();
        southPanel=new SouthPanel();
    }
     void doFrame() {
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setSize(1200, 740);
    }
    public void GraphStructure(){
        graphMetods=new GraphMetods();
        this.strEastPanel();
       // this.strSouthPanel();
        this.strGraphPanel();
        graphMetods.WhitePanel();
        record.createPackage();
        northPanel.strNorthPanel();
        westPanel.strWestPanel();
        southPanel.strSouthPanel();
        frame.add(BorderLayout.NORTH, northPanel.getNorthPanel_1());
        frame.add(BorderLayout.WEST,westPanel.getWestPanel_1());
        frame.add(BorderLayout.SOUTH, southPanel.getSouthPanel_1());
        frame.add(BorderLayout.EAST,EastPanel_1);
        frame.add(BorderLayout.CENTER,new JScrollPane(graphPanel));
        frame.pack();
        frame.setVisible(true);
        System.out.println(graphMetods.getImg().getColorModel());
    }
   // public void strSouthPanel(){
   //     southPanel.getSouthPanel_1().setBackground(new Color(80, 100, 100));
    //}
    public void strEastPanel(){
        EastPanel_1.setBackground(new Color(70, 40, 29));
    }
    public void strGraphPanel(){
         graphPanel.addMouseMotionListener(actions.getMouseMotionEv_1());
         graphPanel.addComponentListener(actions.getComponentEv_1());
         graphPanel.addMouseListener(actions.getMouseEv_1());
    }
    public GraphPanel getGPanel(){
        return graphPanel;
    }
    public SouthPanel getSPanel(){return southPanel;}
 
}
Если необходимо-скину полный проект
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.12.2014, 20:00
Ответы с готовыми решениями:

JPanel для рисования и JScrollPanel
Делаю графический редактор. Холст - JPanel на которой изображаются фигуры. Размеры холста постоянно меняются в ходе выполнения программы....

Управление JScrollPanel
Есть свой гарфический редактор и у него класс холст, нужно добавить на холст скрол, чтобы если изображение которое загружаю большое очень,...

JScrollPanel отображает только 5 рядов
таблица 10 рядов, находится внутри JScrollPanel JScrollPanel отображает только 5 рядов Как установить(выделить) последний...

12
 Аватар для snajper_ro
116 / 101 / 52
Регистрация: 14.09.2011
Сообщений: 696
Записей в блоге: 1
29.12.2014, 20:17
Scrollable я вот этим интерфейсом решил эту проблему у себя
Java
1
2
3
public Dimension getPreferredSize() {
        return new Dimension(1300, 1000);
    } надо еще вот этот метод до определить
в дополнение к остальным
0
0 / 0 / 0
Регистрация: 18.12.2014
Сообщений: 69
30.12.2014, 15:02  [ТС]
можете поподробнее? Как можно применить это к моему проекту?
0
 Аватар для snajper_ro
116 / 101 / 52
Регистрация: 14.09.2011
Сообщений: 696
Записей в блоге: 1
30.12.2014, 16:00
view.txt Тут я реализовал вывод текста на панель, конечно не с самых умных идей , но все таки вышло, если у вас проблема с самими скролами , то это поможет. А если скролы у вас работают , а не отображется картинка, то напишите
0
0 / 0 / 0
Регистрация: 18.12.2014
Сообщений: 69
30.12.2014, 16:19  [ТС]
Файл, который вы мне послали почему- то не работает, massEI красным отображается, вот мой проект полный. Просто нарисуйте на поле что-нибудь и нажмите на левой панели крайнюю правую кнопку с цифрой 4, и увидите. Надеюсь, что поможете. уже 2 день бьюсь( TestImportGraph.rar
0
 Аватар для snajper_ro
116 / 101 / 52
Регистрация: 14.09.2011
Сообщений: 696
Записей в блоге: 1
30.12.2014, 16:56
Я вам скинул файл для аналогии работой с панелью и сролами, это из моего проекта. А в вашем проекте при нажатии 4 ничего не происходит
0
0 / 0 / 0
Регистрация: 18.12.2014
Сообщений: 69
30.12.2014, 17:00  [ТС]
жмете 4 и тыкайте по панели, где рисуете. Изображение увеличивается, но скроллы не появлятся
0
 Аватар для snajper_ro
116 / 101 / 52
Регистрация: 14.09.2011
Сообщений: 696
Записей в блоге: 1
30.12.2014, 17:11
проблема в том что картинка не открывается.скиньте полностью проект,что бы я его к нет бинску подключил, и у меня кнопки не отображаются .Имена, их значения по умолчанию
0
0 / 0 / 0
Регистрация: 18.12.2014
Сообщений: 69
30.12.2014, 17:19  [ТС]
Это и есть полный проект. имена у кнопок такие я специально дал. Сейчас поправил пару кнопок, чтоб понятнее было, как фотку открыть. После открытия фотографии нажмите один раз на поле чем-нибудь, а то оно не сработает. и я пока проверял его только с png файлами, с другими форматами не пробовал TestImportGraph.rar
0
 Аватар для snajper_ro
116 / 101 / 52
Регистрация: 14.09.2011
Сообщений: 696
Записей в блоге: 1
30.12.2014, 17:32
скиньте все необходимое , еще файл с фото, а то мой не открывается
0
0 / 0 / 0
Регистрация: 18.12.2014
Сообщений: 69
30.12.2014, 17:46  [ТС]
закиньте эту папку из архива на диск C и выбирайте любое фото. После того как выбрали щелкните простым карандашом раз по фотке в любом месте. Затем нажмите на цифру 4 и по любой точке панели для рисования один щелчок. Pictures.rar И вот еще версия редактора, уж простите. Я там еще и кнопку с карандашом подписал чтоб удобнее было TestImportGraph.rar
0
 Аватар для snajper_ro
116 / 101 / 52
Регистрация: 14.09.2011
Сообщений: 696
Записей в блоге: 1
30.12.2014, 18:42
Не у меня не выходит, надо разбивать на маленькие задачи.
0
0 / 0 / 0
Регистрация: 18.12.2014
Сообщений: 69
30.12.2014, 18:56  [ТС]
В общем задача такая, если по простому- если размер Image превышает размер BufferedImage, создать Скроллы, за которыми и будет скрыта та часть Image, которая не влезла. BufferedImage дан изначально, Image получаем после некоторой работы над начальным BufferedImage.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
30.12.2014, 18:56
Помогаю со студенческими работами здесь

Алгоритм для масштабирования изображения
вот пример того что мне нужно сделать http://rvolve.com/zoom_pic.php . что реализовать подобный эффект использовал алгоритм ...

Алгоритм масштабирования изображения
Здравствуйте! Я новичок в компьютерной графике, а в курсовом проекте необходимо сделать программу, которая загружает изображение, затем...

Алгоритм масштабирования изображения
Дорогие форумчане помогите придумать алгоритм масштабирования изображения. Чтобы описание алгоритма было понятным программисту, т.е. Четки...

Нужен пример масштабирования изображения
Если у кого-то есть немного времени - прошу составить небольшую программу, т.к. мне необходимо завтра сдать ее и нет возможности установить...

Масштабирования изображения при наведении на него курсора
Народ помогите!!! Создать компонент - потомок TImage, который проводит масштабирования относительно размеров компонента при наведении...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru