• Обработка фото на Java, какие есть библиотеки?

    @odissey_nemo
    Программист, ГИС-системы, растры, космоснимки
    Стандартные библиотеки Java для работы с библиотеками существуют несколько десятилетий и послужили основой для большинство прочих библиотек, доступных сегодня в других средствах программирования.

    Для чтения в память и записи на диск изображений - класс ImageIO для самых разнообразных форматов, существующих для растров.
    Далее работает широчайший набор классов, описывающих все возможные варианты хранения глубины цветности, от 1 бита (BINARY) до 32 бит (RGBA), но может и больше, давно не смотрел туда. Почти все варианты хранения цветов одного пиксела (interleaved, bands и т.д.) внутри растра и т.д.

    Реально даже встроенные библиотеки Java уже сложны для полного освоения, настолько глубоко и полно там всё продумано и абстрагировано. Начать можно отсюда.
    Вообще документации про Java 2D графику в Оракле - море.
    Но базовые операции просты для освоения и запоминания последовательности действий при получении устойчивых и приятных результатов.

    Существуют и многие внешние библиотеки, доступные в Java и других языках и средах программирования. Пример тут.
    GDAL - один из мощных примеров специализированной библиотека по работе с данными ДЗЗ (дистанционного зондирования Земли), легко доступной из Java.
    Ответ написан
    Комментировать
  • Как разбить значение на 3 части?

    @odissey_nemo
    Программист, ГИС-системы, растры, космоснимки
    Можно так:
    ...
            // Test to change datetime items in text form
    
            SimpleDateFormat sdfIn  = new SimpleDateFormat( "dd.mm.yyyy" );
            SimpleDateFormat sdfOut = new SimpleDateFormat( "yyyy.mm.dd" );
    
            String strIn = "25.11.2023";
            Date dt = sdfIn.parse( strIn );
            String strOut = sdfOut.format( dt );
    
            System.out.printf( "+++ Convert date format: '%s' -> '%s'%n", strIn, strOut );
    ...

    Результат: +++ Convert date format: '25.11.2023' -> '2023.11.25'
    Ответ написан
    Комментировать
  • Есть ли такой сервис с AI?

    @odissey_nemo
    Программист, ГИС-системы, растры, космоснимки
    Если естественный интеллект не понимает, по тексту описания, что надо сделать, то ИИ тем более не поймёт)))
    Ответ написан
    Комментировать
  • Как удалить символ разделителя из значений?

    @odissey_nemo
    Программист, ГИС-системы, растры, космоснимки
    Стало быть, в этом CSV есть поля, ограниченные, например, через двойной апостроф ("), как раз для случаев, когда разделитель попадается внутри поля. А разделители полей в вашем файле CSV - точка с запятой (;). И надо внутри полей удалить все (;) являющиеся частью данных, но не разделителями.
    В принципе, задача достаточно рутинная и часто встречаемая.
    Т.к. работаю иногда с CSV, то за годы накопился кое-какой инструментарий для этого. В частности, своя библиотека на Java. Иногда пользую и сторонние библиотеки, например Apache Common CSV . Все такие библиотеки, не только на Java, содержат функциональность считывания CSV по одной cтроке и записывания по одной строке в другой CSV.
    Т.е. нет никаких трудностей написать программу на Java в 5-10 строк, которая по очереди считывает каждую строку CSV, из каждого поля удаляет (;) и записывает новую строку с теми же разделителями и ограничителями полей (;) и ("). В итоге получится файл, выглядящий как исходный, за исключением символа (;) в данных. Этот способ сработает быстрее всех прочих на порядки, а по памяти он кушает и на 3-4 порядка меньше.
    Есть и специальные быстрые редакторы, заточенные именно на CSV. Пользовал такой. Скорее всего , он сможет открыть ваш файл, достаточно быстро выполнить операцию и сохранить результат. Хотя придётся слегка его поизучать.
    Ответ написан
    Комментировать
  • Где найти полигоны административных районов и микрорайонов городов рф?

    @odissey_nemo
    Программист, ГИС-системы, растры, космоснимки
    Ответ написан
    Комментировать
  • Влияют ли на производительность неиспользуемые библиотеки?

    @odissey_nemo
    Программист, ГИС-системы, растры, космоснимки
    Вопрос о наличии в памяти неиспользуемых библиотек изучен слабо.
    Теоретически можно предположить, что при загрузке всё лишнее отключаются. Тогда - не влияет никак.
    А если не отключается - то влияет, но размер доступной памяти уменьшается на размер библиотек.
    Хуже с библиотеками, в которых тебе нужны несколько методов, а оставшиеся десятки мегабайт - только балласт. Пример - биб-ка smile (Java), содержащая десятки мегабайт исполняемого кода по всем направлениям математической статистики, а нужно только корреляцию Пирсона посчитать.
    Тут, скорее всего, вся библиотека грузится, но используется, дай разум, 1% от её общего размера.

    В своё время в Delphi нравилось то, что при сборке EXE из объектных (откомпилированных) модулей подключались лишь те, на которые были ссылки.
    Если современные среды разработки способны на такое, то было бы полезно все библиотеки подключать в виде исходных кодов и компилировать в свою собственный исполняемый модуль.
    Это дало бы максимальные эффект по оптимизации памяти.
    Ответ написан
    2 комментария
  • Как определить качество изображения?

    @odissey_nemo
    Программист, ГИС-системы, растры, космоснимки
    Что, если пройтись матричным фильтром, размерностью 3x3, 5x5, 7x7 и т.д.
    В ответе он выдаёт среднее цветовое расстояние между центральным пикселем и соседними.
    Прямо в цикле суммируешь эти величины. В конце делишь на площадь в пикселях. И получаешь среднюю изменчивость картинки на пиксель.
    Провести несколько экспериментов, найти пороговое значение на свой вкус. Оценить изменение значений в зависимости от размера фильтра, размера изображения, вида изображения (цветное, серое).
    И выдать суждение: до сюда - нормальное изображение, а отсюда - размытое. Между значениями - неопределённость.
    Может и получиться!
    Цветовая дистанция - это тоже проблема, как его посчитать.
    Последнее время использую простую эмпирическая функция расчёта разницы между двумя цветами в Java:
    public static final double SQRT_3 = Math.sqrt( 3.0d );
    
    	/**
    	 * Calculates distance in RGB color space with Euklidian distance between each component
    	 *
    	 * @param c1 {@link Color} one
    	 * @param c2 {@link Color} two
    	 * @return double result of comparison. Max possible distance is 255.0. Minimum 0.0
    	 */
    	public static double colorDistance( Color c1, Color c2 )
    	{
    		double rDist = c1.getRed() - c2.getRed();
    		double gDist = c1.getGreen() - c2.getGreen();
    		double bDist = c1.getBlue() - c2.getBlue();
    		double distance = Math.sqrt( rDist * rDist + gDist * gDist + bDist * bDist ) / SQRT_3;
    		return distance;
    	}//end color distance method

    Уже не помню, почему именно её, т.к раньше была другая, но изменил по каким-то теоретическим соображениям. Давно.
    Для моих задач работает сносно. Разница получается от 0 (одинаковые цвета) до 255 (между чёрным и белым).
    В Инете можно найти уйму других подходов.
    Ответ написан
    Комментировать
  • Как удалить из hashmap все элементы с одинаковым значением?

    @odissey_nemo
    Программист, ГИС-системы, растры, космоснимки
    Создаёшь новый пустой HashMap newMap - это будет результат.
    Создаёшь пустой Set newSet - через него будем фильтровать значения.
    Из заданного HashMap oldMap получаем все ключи из oldMap (key) как keySet - это набор всех ключей твоего oldMap.
    Проходишь по oldMap с помощью keySet, извлекая поочерёдно значения (val) из oldMap.
    Каждое значение val проверяешь на наличие его в newSet.
    Если оно там присутствует, ты нашёл ключ к дублированному в oldMap значению val и не сохраняешь его.
    Если val в newSet отсутствует, помещаешь его туда и копируешь пару key<->val из oldMap в newMap;

    После конца алгоритма в newMap имеешь набор только уникальных значений.
    Ответ написан
  • Как сделать интерфейс к программе на Java?

    @odissey_nemo
    Программист, ГИС-системы, растры, космоснимки
    Обычно большую прогу, с новой логикой и в спокойной обстановке (без бешенства манагеров и директоров) начинаю писать с того, что на интерфейсах описываю абстрактную необходимую функциональность. А потом уже её реализую.
    Особенно это полезно, когда пишешь не один. В этом случае, ты реализуешь свои, согласованные с командой интерфейсы, спокойно обращаясь к нереализованным, которые реализуют другие, не тормозя тебя в начале начал.

    В вашем случае можно (знаю это только для JIdea) создать и отладить реально работающий класс. А затем, щелчком пПКМ по имени этого класса и далее из всплывшего меню "Refactor"->"Extract interface". И вуаля, если нет плохих зависимостей, то интерфейс (в смысле синтаксиса Java и как отдельный файл класса) готов. Осталось его грамотно откомментировать и, может быть, реализовать некоторые дефолтные методы, перенеся их из уже написанного кода. Или ещё что потребуется. Но главное , интерфейс для рабочих методов , уже есть.

    А уж реализовать интерфейс в плагине - дело техники. Загрузить плагин и вызвать как инстанс класса интерфейса - тоже не сложно.
    Ответ написан
    Комментировать
  • Как раньше люди программировали?

    @odissey_nemo
    Программист, ГИС-системы, растры, космоснимки
    Раньше было на порядок больше дела, на два порядка меньше банков, рекламы, посредников, пробок, конкурентов, владельцев средств производства и инвесторов.
    Совсем не было менеджеров. А были руководители (часто от бога), собаку съевшие на деле, которым занимались. Некоторых помним и сегодня, спусти 30 лет после их смерти. Придут ли сегодняшние программеры на могилку своего текущего тим-лида через 30 лет? ответ очевиден.
    Отсюда и задачи стояли более интересные, разнообразные, ответственные. И ты мог заниматься ими десятки лет.
    Пригождался любой человек, а не только юные гении, знающий все вопросы на собеседовании. Но не способные связать двух слов с товарищами или посоветовать что-то.
    Вероятность получить в ответ на твой произвольный вопрос фразу: "Я занят, некогда мне с тобой" была исчезающе мала.
    Больше времени люди проводили в обсуждениях совместных и мероприятиях вне работы (и отпуска проводили вместе). Мало, очень мало было личных проектов.
    Работало много институтов. создающих свои машины, свои операционки, свои языки программирования.
    И достигали реально многого. Уважали друг друга.
    Уволить тебя, если ты не был откровенным тунеядцем. было невозможно.

    В целом, работать было на порядок интереснее. И задачи стояли на порядок важнее и реальнее Как в программировании, так и в материальном производстве.
    Ответ написан
    Комментировать
  • Как оптимизировать данный код?

    @odissey_nemo
    Программист, ГИС-системы, растры, космоснимки
    1. Памяти под внутренние переменные в приведённых примерах практически не выделяется. вообще
    Если требование по памяти относится именно к памяти под данные, то условие однозначно выполнено!
    А вот требование по памяти всего процесса, под систему, код и данные, и если 50 мегабайт не хватило, то проблема явно не в данных, а настройках компилятора. Например. можно уменьшить размер стека из хипа, который тут практически не требуется.
    2. Как проверяется условие по памяти? У меня на версии Java 8 следующий код сообщает, что занято 20 мегабайт:
    Runtime rt = Runtime.getRuntime();
            long usedMB = (rt.totalMemory() - rt.freeMemory()) / 1024 / 1024;
            System.out.printf("Usage mamory %d Mb%n", usedMB);

    3. Возможно, для уменьшения потребности в памяти следует взять менее прожорливую версию Java. Уверен, что от версии к версии требования к памяти чисто под системные модули однозначно растёт в большую сторону. Хотя с т.з. Java вообще затруднительно отделить память рантайма и кода с данными пользователя. Т.е. 50 мегабайт - это может быть размер программы типа "Hellо World" для Java 8+.
    Ответ написан
    Комментировать
  • Изменить цвет краёв в JMenu?

    @odissey_nemo
    Программист, ГИС-системы, растры, космоснимки
    Попробуйте вызывать такой метод:
    /**
         * Sets the current system look and feel properties
         */
        public static void setSystemLookAndFeel() {
            /* Get the default operation system style */
            final String uiName = UIManager.getSystemLookAndFeelClassName();
            /* Set this default current style for our task */
            try {
                UIManager.setLookAndFeel( uiName );
            } catch ( Exception ex ) {
                System.err.printf( "--- Can't set GUI default system style (%s):%s%n", uiName, ex.getMessage() );
            }
        }

    Где нибудь в начале конструктора JFrame главного окна программы.
    Может, проблема отпадёт и всё станет хорошо.
    Ответ написан
    Комментировать
  • Где взять карты снятые со спутника?

    @odissey_nemo
    Программист, ГИС-системы, растры, космоснимки
    На снимках со спутника - снимки поверхности Земли. Это не карта, а ортонормированный (приведённый в проекцию) и цветокорректированный, но - снимок!
    Карта - это есть дешифрованный снимок, как минимум. И "снять" её со спутника никак нельзя. Её можно только изготовить, пусть и на основе спутниковых снимков.
    Да, поверх снимка практически все т.н. картографические (на деле фотокартографические) сервисы наносят какую-либо картографическую информацию. Но это не вся картографическая информация, которая есть на настоящих картах. В основном наносят транспортную информацию. Для туристов и для рекламы.
    Ответ написан
    Комментировать
  • Плавное появление окна JFrame?

    @odissey_nemo
    Программист, ГИС-системы, растры, космоснимки
    Прозрачность работает, да.
    Ответ написан
  • Как зашифровать посредством javax.crypto.Cipher с помощью своего ключа?

    @odissey_nemo
    Программист, ГИС-системы, растры, космоснимки
    Вот такая штука работает, зашифровывает и расшифровывает :

    package su.common.crypto;
    
    import org.apache.commons.lang.StringUtils;
    import su.common.misc.Text;
    
    import javax.crypto.Cipher;
    import javax.crypto.KeyGenerator;
    import javax.crypto.NoSuchPaddingException;
    import javax.crypto.SecretKey;
    import java.security.NoSuchAlgorithmException;
    
    /**
     * Created in su.common.crypto.<br>
     * User: ******<br>
     * Date: 30.08.2011<br>
     * Time: 17:12:45<br>
     */
    public class SimpleEncDec {
        private static final String DEFAULT_ALGO_NAME = "AES";
        //	private static final String DEFAULT_CIPHER_NAME = "AES/ECB/PKCS5Padding";
        private static final String DEFAULT_CIPHER_NAME = "AES/ECB/NoPadding";
        private KeyGenerator m_keygen;
        private SecretKey m_key = m_keygen.generateKey();
        private Cipher m_cipherIn;
        private Cipher m_cipherOut;
    
        public SimpleEncDec( String algorithmName ) throws NoSuchAlgorithmException {
    //        KeyGenerator m_keygen;
            if ( Text.isEmpty( algorithmName ) )
                m_keygen = KeyGenerator.getInstance( DEFAULT_ALGO_NAME );
            else
                m_keygen = KeyGenerator.getInstance( algorithmName );
    
            // Create the cipher
            try {
                m_cipherIn = Cipher.getInstance( DEFAULT_CIPHER_NAME );
                m_cipherIn.init( Cipher.ENCRYPT_MODE, m_key );
                m_cipherOut = Cipher.getInstance( DEFAULT_CIPHER_NAME );
                m_cipherOut.init( Cipher.DECRYPT_MODE, m_key );
            } catch ( Exception e ) {
                e.printStackTrace();
            }
        }
    
        public SimpleEncDec() throws NoSuchAlgorithmException, NoSuchPaddingException {
            this( null );
        }
    
        public String encrypt( String arg, String password ) {
            try {
                byte[] res = m_cipherIn.doFinal( arg.getBytes() );
                return Base64.encode( res );
            } catch ( Exception e ) {
                System.err.println(e);
            }
            return null;
        }
    
        public String decrypt( String arg, String password ) {
            byte[] res = Base64.decode( arg );
            try {
                res = m_cipherOut.doFinal( res );
                return new String( res );
            } catch ( Exception e ) {
                System.err.println(e);
            }
            return null;
        }
    
        public static String strPad16( String strToPad ) {
            final int len = strToPad.length();
            if (len % 16 == 0)
                return strToPad;
            return StringUtils.rightPad( strToPad, (len + 16 - (len%16)) );
        }
    
        public static void main( String[] args ) throws NoSuchAlgorithmException {
    
            SimpleEncDec sed = new SimpleEncDec( "AES" );
            // check functionality
            final String password = "simple_password";
    
            String checkStr = "String to encode/decode for algorithms test";
            System.out.println( String.format( "String to encrypt: \"%s\"", strPad16(checkStr) ) );
    
            // encode string
            String encStr = sed.encrypt( strPad16(checkStr), password );
            System.out.println(String.format( "Encrypted into \"%s\"", encStr ) );
    
            final String decrypt = sed.decrypt( encStr, password );
            String decStr = Text.trimRight( decrypt );
            System.out.println( String.format( "Decrypted to \"%s\"", decStr ) );
    
            if ( decStr.equals( checkStr ) )
                System.out.println( "+++ Encryption/decryption works well +++" );
            else
                System.err.println( "--- Encryption/decryption doesn't work ---" );
        }
    
    }

    Делал давно и все детали забыл напрочь :o) .
    Не указанный Text.trimRight(String) просто убирает все пустые символы справа, от последнего значащего символа. Text.isEmpty(String) проверяет, пуста ли строка ("", null) или нет.
    Класс Base64 переводит байтовые массивы в массив символов Basе64 и обратно.

    В выбранном Вами алгоритме требуются входные строки длиной кратной 16 символам, т.е. 16,32,48,64 и т.д.
    Ответ написан
    Комментировать
  • Как добавить фотографии на яндекс карты?

    @odissey_nemo
    Программист, ГИС-системы, растры, космоснимки
    Никак. Фото надо хранить, а денег вы Яндекс-инвестору не добавили. Это неправильно, с его т.з.
    Точно также думают и все прочие похожие сервисы.
    Добавлять можно только фото злачных (обычно) мест, уже размещённых на Яндекс-картах с рекламными целями.
    Всё должно служить одной лишь прибыли!
    Ответ написан
    Комментировать
  • Из каких ресурсов можно получить тайлы любого из этих форматов?

    @odissey_nemo
    Программист, ГИС-системы, растры, космоснимки
    SAS.Planeta. Растровые тайлы с разнообразных ресурсов. Пользуюсь много лет, периодически обновляется, обходит всё новые защиты этих ресурсов.
    В общем смысле тайл - это обязательно растр в том или ином масштабе, в сумме составляющий растровую карту местности в одном из масштабов растровой пирамиды.
    Ответ написан
    Комментировать
  • Как выучить java?

    @odissey_nemo
    Программист, ГИС-системы, растры, космоснимки
    В своё время обучение программированию осуществлялось по иному, более человеческому алгоритму.
    Тебе являлся старший или просто более опытный товарищ, своеобразный гуру, который отвечал тебе на все твои вопросы, но не писал программы за тебя.

    Потыкавшись , с его помощью пару недель, ты вдруг начинал понимать, что пишешь!

    Возможно, на периферии бывшей великой страны, вне чёрного города жёлтого дьявола Москвабада, что-то ещё и сохранилось из тех, человечных времен. Поищите, а вдруг)))
    Ответ написан
    Комментировать
  • Java swing. как переопределять paintComponent() несколько раз, в зависимости от нажатой кнопки?

    @odissey_nemo
    Программист, ГИС-системы, растры, космоснимки
    Давно Свингом не занимался, но скоро буду)) Пока есть только предложение - раз есть один BufferedImage, что мешает заменять его на другой прямо по ссылке, не перерисовывая имеющийся (создав-закачав нужное предварительно из ресурса или с диска), и потом уже вызывать paintCоmponent (repaint?) сразу после замены?

    И не проще ли использовать файлы Icon, а не BufferedImаge, который достаточно низкоуровневый? Но это, конечно, только для случая, когда иконки статические, не динамически рисуемые.

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

    Сами механизмы забыл, пишу только общие соображения. Позже найду примеры собственные и вспомню))
    Ответ написан
    Комментировать
  • Как отслеживать время в приложении?

    @odissey_nemo
    Программист, ГИС-системы, растры, космоснимки
    Может, время исполнения, т.е. время с момента старта программы?
    Если да, то удобно org.apache.commons.lang.time.StopWatch.
    Ответ написан
    Комментировать