Java — Как убрать белые рамки в CanvasView

Содержание

Изменение размеров и обрезка изображений с помощью элемента Canvas

Узнайте, как изменять размер и обрезать изображения с помощью JavaScript и элемента HTML5 Canvas , используя при этом инструменты управления, которые вы могли видеть в приложениях для редактирования фотографий:

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

В реальной среде веб-сайт или приложение могут использовать эту технику для изменения размера и создания фотографии профиля перед загрузкой.

Мы могли бы сделать это и на сервере, однако, в этом случае потребуется передача файлов потенциально больших размеров, что займет много времени. Вместо этого мы можем изменить размер изображения на стороне клиента еще до его загрузки. Что позволит сделать все намного быстрее.

Для этого мы создадим элемент HTML5 и выведем изображение на холсте в определенном размере, а затем извлечем новые данные изображения с холста в виде данных URI .

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

Изменение размера очень больших изображений может привести к замедлению работы браузера, или в некоторых случаях даже к сбою приложения. Поэтому имеет смысл установить разумные ограничения на размер файла, который можно загружать. Если для вас важно качество, вы можете найти применение данной техники нецелесообразным, так как браузер при обработке понижает качество изображения.

Существует ряд методов, с помощью которых можно увеличить качество изображений, масштабируемых с холста , однако в этой статье мы их рассматривать не будем.

Окончательный результат вы можете увидеть в этой демо-версии , или вы можете скачать ZIP-архив .

Что ж, теперь давайте приступим!

Разметка

В нашей демо-версии мы начнем с существующего изображения:

Удалить белую рамку вокруг фрагмента

У меня есть проблема, когда я пытаюсь отобразить ListView в моем фрагменте, похоже, есть белая граница вокруг фрагмента. У меня также есть подобный ListView отображается в активности и идеально сочетается с границами экрана. Я собираюсь пост ниже файл XML и скриншот я взял из фрагмента, я надеюсь, что вы можете помочь мне.

Ваш Listview наследуются на Benvenuto Textview’s полях , как это установлено в Aling его. Помещенный взгляды в LinearLayout

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

Как убрать рамку вокруг изображения на кнопке?

Разработка настольных приложений на я. /

Swing, AWT & SWT

25 апр 2012 14:51

Дано — нужна кнопка — изображение. То есть не обычная — кнопка объемная и на ней текст, а изображение реагирующее на события (кстати а хороший ли выбор вообще в данном случае JButton?).

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

25 апр 2012 15:48
25 апр 2012 16:22

Спасибо, но с листенером какие-то косяки. Мне надо на какой то момент disable эту картинку, а mouseListener чего-то не хочет

UPD: а какие swing компоненты позволяют в качестве фона использовать картинку?

25 апр 2012 19:10
25 апр 2012 19:15

UPD: Еще такой вопросик — disabled компонент затемняется. А мне это ненужно. Если я по событию «компонент disabled» буду тупо заменять картинку на ту что нужна мне — это нормально или есть более красивое решение?

25 апр 2012 20:12

UPD: Еще такой вопросик — disabled компонент затемняется. А мне это ненужно. Если я по событию «компонент disabled» буду тупо заменять картинку на ту что нужна мне — это нормально или есть более красивое решение?

Форум русскоязычного сообщества Ubuntu

Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: Java / JavaFX прозрачность и убирание рамки. (Прочитано 1742 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Страница сгенерирована за 0.068 секунд. Запросов: 24.

© 2012 Ubuntu-ru — Русскоязычное сообщество Ubuntu Linux.
© 2012 Canonical Ltd. Ubuntu и Canonical являются зарегистрированными торговыми знаками Canonical Ltd.

Введение в Canvas

В этой статье мы познакомим вас c новым элементом HTML5 — canvas, который позволяет рисовать различные объекты и отображать в самых современных браузерах. Прочитав данный урок, вы узнаете, как получить доступ к элементу canvas, рисовать фигуры, изменять цвета, и стирать объекты. Приобретайте путёвку в современный мир Web технологий.

Я надеюсь, вам понравится эта серия уроков. Она рассчитана на тех, кто имеет какой-то опыт работы в JavaScript, и совсем ничего не знает насчёт элемента canvas. Если вы новичок в JavaScript, не переживайте, вы приобретёте некоторые знания, прочитав данную статью.

Знакомимся с элементом Canvas

Использовать элемент canvas очень просто

Когда вы слышите слово canvas, то вы сразу же думаете о новом HTML5 элементе с одноимённым названием. Технически, это только половина всей правды, но давайте не будем сейчас говорить об этом. Элемент canvas — это нововведение для всех браузеров.

Для того чтобы воспользоваться элементом canvas, необходимо просто создать соответствующий HTML тег, а затем определить ширину и высоту.

Но это конечно же далеко не всё. Код, написанный выше поместит на вашу страницу canvas с прозрачным фоном. Внимание: контент внутри тега canvas будет отображён только в том случае, если ваш браузер является устаревшим и не поддерживает данную функциональность.

Поддержка

Этот элемент только для самых современных браузеров

Должен отметить, что самые современные браузеры поддерживают данный элемент, даже последний Internet Explorer.

  • Internet Explorer (9.0+)
  • Safari (3.0+)
  • Firefox (3.0+)
  • Chrome (3.0+)
  • Opera (10.0+)
  • iOS (1.0+)
  • Andro >К слову сказать, вы можете активировать данный элемент и в ранних версиях Internet Explorer при помощи данного плагина – Explorer Canvas.

Размеры элемента Canvas

В примере, расположенном выше вы уже увидели как применять атрибуты ширины и высоты: width и height. Используя CSS, вы также можете контролировать размеры canvas, как и других HTML элементов. И это вполне логично. Однако так как canvas использует в своём функционале так называемый двумерный контекст, то при применении CSS к размерам холста, приведёт к тому, что все внутренние элементы будут искажены.

Немного о двумерном контексте

Немного выше я сказал, что элемент canvas — это только половина всей истории. Вторая половина — это как раз и есть двумерный контекст, который по сути позволяет вам видеть и всю мощь функционала данного элемента.

Давайте расставим всё на свои места: когда мы используем элемент canvas, то фактически он не помещается на страницу. Вместо него вы получаете рисунок, который формируется в двумерном контексте, а доступ к этому рисунку осуществляется как раз через элемент canvas благодаря JavaScript API. В принципе кому-то эта информация может показаться лишней, однако лишние знания вам не повредят.

Система координат

Если вы когда-либо работали с языками, имеющими дело с 2d графикой (такими как ActionScript, Processing, и т.д.), тогда вы знаете всё о системах координат, основанных на движении. Двумерный контекст в элементе canvas ничем не отличается от перечисленных систем. Он использует стандартную систему координат Cartesian, с начальной точкой (0, 0), расположенной с левой верхней стороны. Движение вправо будет увеличивать значение объекта по оси x, в то время как движение вниз, будет увеличивать значения точек объекта по оси y. Всё довольно примитивно.

Одна единица данной системы координат равняется одному пикселю вашего экрана (в большинстве случаев).

Получение доступа к двумерному контексту

Для того чтобы получить доступ к двумерному контексту, вам понадобится применить JavaScript API. В данном случае, вам потребуется функция getContext. Пример:

Заметьте: в этом примере мы применяем jQuery, но только после того, как страница полностью загрузится. Для этих целей вы можете в полной мере пользоваться вашим любимым JavaScript фрэймворком или поместить скрипт в конец документа.

В результате вызова метода getContext, переменная ctx теперь будет ссылаться на двумерный контекст. Это означает, что теперь при помощи этой переменной вы можете начать рисовать фигуры на элементе canvas. Круто, да?!

Рисуем квадраты

Теперь, когда у нас есть доступ к двумерному контексту, вы можете смело начинать пользоваться всеми функциями вышеупомянутого API. Одной из самых часто используемых функций является fillRect, которая создаёт квадраты чёрного цвета (по умолчанию).

Добавьте следующий код, используя переменную ctx, о которой мы говорили перед этим:

Этот код нарисует чёрный квадрат в левой верхней стороне холста. Примерно вот так вот:

Поздравляю! Вы только что нарисовали вашу первую фигуру в HTML5 элементе canvas. Каковы ощущения?

Заметьте: вы скорее всего уже смекнули, что на самом деле для рисования квадрата используется JavaScript. Это происходит потому, что в функциональности элемента canvas не предусматривается подобного метода (для рисования квадрата). На самом деле квадрат — это тот же самый прямоугольник, у которого все стороны равны.

В методе fillRect может быть прописано 4 параметра:

  • Первый — это позиция по оси x;
  • Второй — это позиция по оси y;
  • Третий — это параметр, отвечающий за ширину;
  • Четвёртый — это высота.

Если расписать прототип метода в псевдокоде, то он будет выглядеть следующим образом:

Хорошая новость заключается в том, что вы не ограничены в функционале, касающемся заливки. Уточню. Вы можете рисовать прямоугольник с прозрачной заливкой и цветной рамкой.Для этого в JavaScript API предусмотрена специальная функция strokeRect:

Данная функция принимает такой же набор аргументов, как и fillRect. В результате вы получите ещё один квадрат:

Просто. Элегантно. И ещё раз просто! Теперь вы поняли принцип, по которому работает элемент canvas. Все остальные методы подобны этим двум. Их использовать так же просто. Если вам кажется это чем-то примитивным, то не переживайте. Все эти элементы в совокупности могут творить чудеса.

Рисование по схеме

Помимо прямоугольников (которые могут быть нарисованы одним методом из API), вы так же можете рисовать фигуры по собственной схеме. Благодаря схемам вы можете создавать прямые или изогнутые линии, а так же более сложные фигуры.

Чтобы создать полноценную схему, вам необходимо будет воспользоваться следующими методами из API:

  • beginPath: начало схемы;
  • moveTo: метод для создания точки;
  • lineTo: рисует линию от точки до точки, которые были созданы методом moveTo, или до точки от прошлой линии, нарисованной методом lineTo;
  • closePath: завершить схему.
  • fill: заполнить фигуру цветом.
  • stroke: создать контур.

Попробуйте следующий пример:

Данный код нарисует треугольник чёрного цвета:

Те же самые принципы вы можете использовать для рисования фигур, которые вам понадобятся. В следующем уроке, посвящённом данной теме, мы поговорим о более продвинутом рисовании фигур, таких как овалы, кривая Безье и др.

Стоит сказать об этом именно сейчас: рисование по схеме применяется для создания более сложных фигур чем прямоугольники.

Изменение цветов

Итак, всё что мы рисовали до сих пор, будь то прямоугольник или треугольник, окрашивалось в чёрный цвет. Круто! Однако, существует множество функций в JavaScript API, которые позволят вам с лёгкостью изменить цвет фигуры, которую вы рисуете. Вашему вниманию представляю fillStyle и strokeStyle.

Объявлять тут в принципе нечего, поэтому давайте сразу же применим их на практике:

Данный код окрасит квадрат в красный цвет:

Или вы можете изменить цвет рамки квадрата:

Вот вы и научились применять данные методы:

Методы fillStyle и strokeStyle удобны тем, что они используют те же цвета, что и в привычном вам CSS. Это значит, что вы можете использовать RGB, RGBA, HSA, специальные слова (“red”) и шестнадцатеричные значения.

Сразу стоит отметить, что изменение цвета не приводит к преобразованию уже существующего содержания элемента canvas. К примеру, если вы нарисовали черный прямоугольник, затем создали наполнитель для красного цвета, а потом нарисовали ещё один прямоугольник, то первая фигура останется чёрной.

Изменение толщины линий

Теперь плавно перейдём от изменения цветов к изменению значения толщины линий. Для данного функционала существует ещё один метод из JavaScript API — lineWidth.

Можете добавить данный код в прошлый пример:

И вот какой у вас получится результат:

Такой же принцип вы можете применить со схемами. К примеру, вы можете изменить пример с треугольником:

И вот что у вас получится:

Также в JavaScript API, существует ещё метод, который позволят вам изменить вид линий. К примеру, lineCap изменяет вид отображения конца линии, а lineJoin изменят отображение углов. Более подробную информацию вы можете найти в спецификации.

Стираем объекты из Canvas

Последняя вещь, которую я хочу вам сегодня показать – это стирание объектов. Вы уже знаете, как нарисовать фигуру. Теперь пришло время узнать как от неё избавиться :)

В принципе тут всё так же просто; вам нужно всего-навсего воспользоваться очередным методом из JavaScript API. Этот метод называется clearRect. Его задача заключается в том, чтобы сделать каждый указанный пиксель полностью прозрачным.

В этом примере на canvas 500px в ширину и 500px в высоту. Для очищения всей площади, вам необходимо сделать следующее:

В этом примере скорее всего не нужно подтверждать работу кода скриншотом, так как вы ничего не увидите. Квадрат действительно был нарисован, а затем мгновенно стёрт.

Заметьте: аргументы для метода clearRect точно такие же, как и для fillRect; x, y, ширина и высота.

Если вы не определились с высотой и шириной, то можете писать и так:

Стирание небольших фрагментов

Для того чтобы стереть небольшой фрагмент, вам не обязательно зачищать всю площадь элемента canvas. Вы без проблем можете стереть необходимую вам область. Представьте, что у вас нарисовано 2 квадрата, один из которых вы хотите стереть:

На данный момент картина такая:

Вы без проблем можете стереть черный квадрат, а красный оставить на месте при помощи метода clearRect:

Заметьте, что данные должны совпадать с теми, что вы указывали при создании элемента. На самом деле данный метод просто изменяет прозрачность каждого пискеля:

Довольно-таки просто, не так ли? Вы нечасто будете стирать элементы при рисовании, однако эти знания понадобятся вам, когда мы будем учиться делать анимацию.

Идём в ногу со временем

Canvas прост в использовании и изучении

Надеюсь, вы убедились в том, что canvas — это очень перспективный элемент веб страницы. Он позволяет создавать вам изображения, используя чистый код без никаких плагинов. Он прост в использовании и изучении, и на самом деле в умелых руках может превратиться во что-то очень оригинальное.

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

А сейчас, я надеюсь, вы получили много полезной информации, которая позволит вам получить общее представление об canvas. Данный элемент — это фантастическая технология, которая позволит вам реализовать все фантазии, которые хранятся у вас в голове.

Данный урок подготовлен для вас командой сайта ruseller.com
Источник урока: www.net.tutsplus.com/tutorials/javascript-ajax/canvas-from-scratch-introducing-canvas/
Перевел: Станислав Протасевич
Урок создан: 28 Марта 2011
Просмотров: 59893
Правила перепечатки

5 последних уроков рубрики «HTML и DHTML»

Лайфхак: наиполезнейшая функция var_export()

При написании или отладки PHP скриптов мы частенько пользуемся функциями var_dump() и print_r() для вывода предварительных данных массив и объектов. В этом посте я бы хотел рассказать вам о функции var_export(), которая может преобразовать массив в формат, пригодный для PHP кода.

17 бесплатных шаблонов админок

Парочка бесплатных шаблонов панелей администрирования.

30 сайтов для скачки бесплатных шаблонов почтовых писем

Создание шаблона для письма не такое уж простое дело. Предлагаем вам подборку из 30 сайтов, где можно бесплатно скачать подобные шаблоны на любой вкус.

Как осуществить задержку при нажатии клавиши с помощью jQuery?

К примеру у вас есть поле поиска, которое обрабатывается при каждом нажатии клавиши клавиатуры. Если кто-то захочет написать слово Windows, AJAX запрос будет отправлен по следующим фрагментам: W, Wi, Win, Wind, Windo, Window, Windows. Проблема?.

15 новых сайтов для скачивания бесплатных фото

Подборка из 15 новых сайтов, где можно скачать бесплатные фотографии для заполнения своих сайтов.

Пишем игру для Andro > Как Вы помните,первый урок цикла носил несколько обзорный характер. Мы пофилософствовали на тему аркадного игростроения, обсудили модули, из которых будет состоять наша игра, и написали небольшую заготовку, которую мы будем в дальнейшем развивать и усиливать. Если Вы по каким-то причинам пропустили этот урок, настоятельно рекомендую Вам все-таки ознакомиться с ним. Кстати, там же можно скачать исходник проекта, именно он является отправной точкой для этого урока.

Сегодня мы займемся графикой. Вывод изображения на экран телефона в Android задача почти тривиальная. Не будем ходить вокруг да около, а сразу займемся делом. Для начала выведем изображение робота в верхнем левом углу экрана. Для работы с графикой предпочтительно использовать png формат. Наш рисунок будет называтьсяdroid_1.png и иметь размер 20×20 пикселей. Для того, чтобы с рисунком стало можно работать из приложения, просто скопируйте его в папку/res/drawable-mdpi вашего проекта. Проще всего это сделать, перетащив файлик в соответствующую папку в дереве проектов в Eclipse.

Кстати, обратите внимание, в проекте существует несколько папок drawable. Дело в том, что ваша программа может запускаться на устройствах с разными размерами и разрешениями экрана, поэтому имеет смысл подготовить несколько наборов графических файлов, отличающихся размером картинок. В зависимости от того, где будет работать программа, выбирается тот или иной набор. Я выбрал папку drawable-mdpi, которая соответствует устройствам со средней плотностью точек на экране.

Откройте файл MainGamePanel.java и измените метод onDraw(Canvas canvas)

Метод drawBitmap выводит изображение dro >
Помимо метода onDraw нам понадобится также внести некоторые изменения в поток MainThread. Откройте файл MainThread.java и измените метод run()

Как видите, мы объявили переменную canvas типа Canvas. Canvas очень распространенная в графических библиотеках концепция. Наиболее адекватно на русский язык canvas переводится как холст. Можно воспринимать этот объект, как лист бумаги, на который можно нанести рисунок. Объект Canvas содержит ряд команд, позволяющие выполнять различные операции рисования.

Мы пытаемся инициализировать эту переменную с помощью метода surfaceHolder.lockCanvas() — то есть связать переменную с активной поверхностью view. Этот код помещен в операторные скобки try <. >finally < . >. Если внутри блока try произойдет ошибка, ну например по каким-то причинам нам не удастся заблокировать canvas под себя, то программа не завершится, а выполнится код в блоке finally. Если нам удастся получить в свое распоряжение Canvas, мы передаем его в качестве параметра методу gamePanel.onDraw, внутри которого и осуществляется рисование.

Обратите также внимание на блок synchronised. Включив этот блок в наш код, мы указываем, что получаем surfaceHolder в свое полное распоряжение, блокируем его. Это значит, что до тех пор, пока блок synchronised не закончится, никто другой параллельно не сможет работать с этим объектом.

Описанная выше логика построения программы довольно проста, тем не менее, эта заготовка может быть использована для создания подавляющего большинства аркадных игр. Запустите программу, Вы увидите следующую картинку.

Перемещение изображения

Итак, мы научились выводить картинку на экран, давайте заставим ее двигаться. Как? Используем наши пальцы. Напишем простую реализацию drag and drop функции (кстати, более подробно об drag and drop рассказанов этой статье). Чтобы переместить рисунок, мы должны щелкнуть по нему и переместить в точку, соответствующую координатам касания. После того, как пользователь отрывает палец от экрана, координаты этой точки запоминаются и рисунок выводится туда.

Давайте создадим для нашего робота отдельный класс Droid.java, в котором определим поля для хранения координат и, собственно, рисунка.

Класс очень простой. В нем определены три поля (x,y и bitmap), методы get и set, позволяющие считывать и записывать их значения, а также конструктор, внутри которого происходит начальная инициализация полей класса.

Нам также понадобятся переменные, для хранения состояния робота. В рамках решаемой в данный момент задачи робот может находиться в одном из двух состояний «перетаскивается» или «не перетаскивается». Определить эти состояния можно с помощью логической переменной touched. В момент, когда пользователь коснулся изображения робота, эта переменная должна принимать значение true. False она примет лишь в момент, когда палец будет снят с экрана.

Давайте немного доработаем класс Droid. Добавим в него метод, осуществляющий рисование draw и метод обработки касания handleActionDown.

Методы draw и handleActionDown обсудим чуть позже, а пока давайте немного поправим код в файле MainGamePanel.java.

В конструкторе класса MainGamePanel мы создали объект droid. В методе onTouchEvent обрабатывается событие касание экрана (MotionEvent.ACTION_DOWN). Если касание произошло, мы вызываем метод handleActionDown, куда передаем координаты. Приведем еще раз листинг этого метода.

Мы сравниваем координаты касания с координатами робота, и если касание происходит внутри прямоугольной области, соответствующей картинке робота, мы изменяем его состояние setTouched(true); в противном случае меняем на false.

Вернемся к методу onTouched. Помимо события MotionEvent.ACTION_DOWN, там обрабатывается событие MotionEvent.ACTION_MOVE. Оно возникает при перемещении пальца по экрану. Внутри обработчика этого события, мы проверяем состояние робота (значение поля touched) и если оно равно true — обновляем координаты робота. В обработчике события MotionEvent.ACTION_UP мы переводим состояние робота в false.

Перейдем к методу Draw. Как помните, он вызывается у нас на каждом шаге игрового цикла. Внутри этого метода мы красим экран в черный цвет, а затем вызываем метод draw объекта droid, который выводит робота на экран.

Можете запустить проект и попытаться поперетаскивать робота по экрану.

Самостоятельное перемещение робота

Давайте теперь придадим нашему роботу самостоятельности и заставим его путешествовать по экрану без вмешательства пользователя. Робот не должен выходить за пределы экрана. Если он дошел до края — он должен изменить направление своего движения. Если наш объект движется самостоятельно — у него должна иметься какая-то скорость. Величина этой скорости влияет на изменение координат. Для понятия «скорость» мы реализуем собственный класс Speed.

Создайте класс Speed.java

Робот имеет горизонтальную и вертикальную составляющую скорости. На каждом шаге цикла к текущей координате робота будим прибавлять соответствующую скорость (на самом деле в физическом смысле правильнее было бы прибавлять величину скорости, умноженную на время прошедшее с прошлой операции перемещения объекта, но мы в целях упрощения не будем так сильно заморачиваться). В конструкторе переменным vx и vy мы присвоили значение 1, то есть на каждом шаге игрового цикла робот будет смещаться на 1 пиксел. Если vx > 0 — робот движется вправо, если vx 0-вниз, vy

Масштабирование и изменение размеров картинок с помощью canvas

Эта статья расскажет вам, как используя элемент canvas обрезать изображение или поменять его размер. В процессе мы создадим инструмент, который обычно используется в программах для обработки фотографий.

Пример из обычной жизни: часто сайты или приложения подобным способом изменяют размер фотографии и обрезают ее для установки аватара пользователя. Эта операция может проходить на сервере, но для этого необходимо передать туда файл, что замедлит процесс. Вместо этого, чтобы сэкономить время, можно изменить размер фотографии на клиентской стороне до ее загрузки на сервер.

Способ заключается в том, чтобы создать HTML5 элемент и привязать фото к холсту заданного размера, затем извлечь из canvas изображение в обновленном виде в формате URI. В большинстве браузеров поддерживается этот способ, так что опробовать его можно уже прямо сейчас, однако от браузера не зависит качество выполнения этой задачи.

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

На конечный результат можно посмотреть, перейдя на страницу «демо», ссылка на которую находиться в конце статье и там найти ссылку со всем кодом.

Начнем же наш не простой путь!

Немного верстки для нашего урока

Мы начнем с верстки исходного изображения, которое будет подвергаться обработке:

Все! Для этого инструмента HTML больше не понадобится.

Добавим чуть-чуть CSS красоты

Для начала нужно определить свойства для элементов .resize-container и для фото:

Теперь определим координаты и свойства элементов resize-handle . Это маленькие квадратики, при помощи которых пользователь будет увеличивать или уменьшать изображение:

Начинаем творить магию используя JavaScript

При работе с JavaScript нужно начать с определения переменных и инициализации canvas и изображения:

Дальше необходимо создать функцию init(), работа которой начинается сразу же. Данная функция «помещает» изображение в контейнер, создает размерные ручки и дублирует исходное фото для изменения его размера. Объект jQuery контейнера нужно привязать к переменной, чтобы потом к нему обращаться. Кроме того, добавляем блок прослушивателя событий mousedown: он будет «узнавать» о движении размерных ручек.

Единственная задача написанных на JavaScript методов startResize() и endResize() – донести до компьютера, когда нужно обратить внимание на движение курсора.

До того, как приступить к слежке за движением курсора, нужно сохранить значения размеров контейнера и другую важную информацию. Все это будет находиться в переменной event_state . Позднее мы вызовем ее во время изменения размера, когда нужно будет определить разницу в высоте и ширине.

В методе resizing() происходит большая часть процесса. Он будет отрабатывать, когда пользователь будет передвигать размерные ручки. Каждый раз, когда он начинает работать, мы определяем новые значения высоты и ширины, определяя расположение курсора относительно исходной позиции размерной ручки.

Далее добавим функцию, которая оставит соотношение сторон нетронутым, если при изменении размера зажата клавиша «shift».

Наконец перейдем к изменению размера фотографии. Главное, чтобы новые значения ширины и высоты не выходили за пределы ограничений, заданных изначально.

Важно! Так как происходит изменение размера изображения (не просто заменяются значения высоты и широты), лучше ограничить число появлений resizeImage для улучшения скорости работы. Это называется регулированием нагрузки.

Меняем размеры изображения JavaScript

Переместить изображение на холст можно при помощи drawImage. Сначала нужно установить высоту и ширину холста, пользуясь командами JavaScript resize, а затем воспользоваться только исходной копией изображения. К холсту применяется команда toDataURL, благодаря чему мы получаем закодированную в Base64 новую версию фото, которая помещается на страницу.

Слишком легко? Есть одна загвоздка: изображение должно находиться на одном домене со страницей или на сервере, на котором возможно совместное использование ресурсов между различными источниками. Если это условие не выполняется, можно столкнуться с ошибкой.

Изменение размера картинки с разных углов

Если вы выполняли все, что было описано в этом уроке, у вас уже должен получиться рабочий пример. Однако он еще не закончен. На этом этапе, с какого бы угла мы ни начинали изменение размера фото, оно ведет себя так, будто мы всегда тянем за нижний правый угол. Нам же нужно иметь возможность пользоваться любыми размерными ручками. Для этого нужно понять, как это должно происходить.

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

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

Нельзя изменить то, что задано по умолчанию, но можно схитрить. Когда пользователь потянет за размерную ручку, находящуюся не в правом нижнем углу, будет меняться положение всего изображения таким образом, чтобы казалось, что противоположный угол и прилежащие к нему стороны остаются на своих местах. Для этого нужно обновить метод resizing:

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

Перемещение изображения JavaScript

Из-за того, что размер фото меняется с любого угла, картинка может непроизвольно переместиться. Нужно позволить пользователям поместить картинку обратно в центр «рамки». Добавим в init() еще один слушатель событий, похожий на тот, который был создан ранее в этой статье.

Установим функции startMoving() и endMoving(), которые ничем не отличаются от startResize() и endResize().

В блоке moving необходимо определить новое положение левого верхнего угла в контейнере. Оно соответствует нынешнему положению курсора, отдаленного на расстояние, на котором он находился в начале процесса изменения размера.

Обрезка изображения JavaScript

Научившись изменять размер фото, можно добавить и функцию его обрезки. Однако не будем давать пользователям свободу в выборе формы и размера обрезанного изображения. Вместо этого нужно создать «рамку», в которой задаются точные размеры, а пользователь должен поместить нужную часть картинки в эту «рамку».

Пропишем следующий HTML:

Очень важны атрибуты блока overlay: положение, высота и ширина. Они нужны для того, чтобы понять, какая часть картинки обрезается. Необходимо также учесть, что «рамка» должна быть заметна на фоне любого цвета. Для этого нужно создать полупрозрачную обводку вокруг «рамки».

Нужно обновить JavaScript следующим прослушивателем событий:

Функция crop() схожа с resizeImage(), только в этом случае мы не передаем данные о ширине и высоте: она сама их «возьмет» из элемента overlay.

Для проведения операции обрезки нужно учесть 9 параметров: первый – исходное изображение; следующие 4 показывают, какая часть картинки используется; последние 4 параметра указывают, в какой части холста и в каком масштабе нужно поместить готовое фото.

Добавляем распознание касаний JavaScript

Созданный инструмент умеет получать события от мыши. Теперь адаптируем ее для сенсорных устройств.

Mousedown и mouseup соответствуют touchstart и touchend (они выполняют те же функции, только получают данные о касаниях, а не о перемещении курсора), а mousemove – touchmove.

Заменим все mousedown, mouseup и mousemove на перечисленные выше аналоги.

Так как инструмент позволяет изменять размер изображения, можно предположить, что некоторые пользователи попытаются сделать это с помощью привычного жеста («щипка») двумя пальцами. При создании приложений для сенсорных устройств очень помогает библиотека Hammer . Так как нам нужно только распознать масштабирование двумя пальцами, добавление этой библиотеки будет чересчур. Сейчас вы узнаете, как распознать жест без библиотек.

В функции saveEventState() мы храним исходную информацию о касании. Теперь она пригодится.

Сначала определим, содержит ли событие 2-ва прикосновения, и измерим расстояние от одного до другого. Это наш «исходник». Затем программа должна постоянно отслеживать, как меняется расстояние между этими касаниями. Обновим код функции moving():

Мы делим расстояние, измеренное на данный момент, на исходное расстояние, чтобы получить коэффициент соотношения, то есть понять, как сильно нужно увеличить или уменьшить изображение. После этого программа получает данные о новых значениях высоты и ширины и только затем меняет размер фото.

Во время тестирования Chrome не дал браузеру отреагировать на масштабирование двумя пальцами так, как по умолчанию (этот жест используется для увеличения или уменьшения веб-страницы).

Надеюсь, эта статья была вам полезна. Далее вы можете прочитать про операцию загрузки файлов на сервер.

как редактировать пикселы и удалить белый фон в брезентовых изображениях в html5 и JavaScript

Если я загрузить изображение, как можно перебрать все его пиксели и превратить белые (или какой-либо цвет уточняет), чтобы быть превращены прозрачными?

У меня есть идея о том, как это сделать, но этот процесс должен быть зацикливание как 2d массив, поэтому он будет включать в себя два для петель.

Я думал, я хотел бы начать на верхней строке первого пикселя, итерация вправо, если ее белый пиксель, то я перехожу его прозрачным, и перейти на 1 пиксель вправо, если ее не белый, то я прекращаю. Затем в том же ряду, я начинаю с крайнего левого пикселя, и проверить, если белый, я включаю его прозрачным, а затем перейти на 1 пиксель влево и т.д., и т.д. .

Затем я перехожу 1 строку вниз и повторите весь процесс ..

Таким образом, я не удалить белые пиксели в самом изображении.

Его довольно просто сделать с помощью getImageData и putImageData просто отметим , вы можете принять довольно существенный удар по производительности чем больше изображение становится. Вам просто нужно , чтобы определить , является ли текущий пиксель белого цвета, а затем изменить ее альфа 0.

Был также задан вопрос, если вы могли бы сделать значения рода нечетких проверить. Его очень легко, просто проверить, если его в определенном диапазоне. Далее повернет от белого до чисто белого прозрачного.

Другие ресурсы

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

В случае MarvinJ , учитывая цвет, вы можете установить все пиксели прозрачными с помощью одной строки:

Входное изображение :

Результат:

Runnable Пример:

Loktar может иметь метод, который «работает», но его производительность довольно мрачная. Это может быть проблемой, если у вас есть много изображений, вы не хотите, чтобы ваш сайт, чтобы осушить ноутбуков / мобильных устройств-батареи, или если вы просто хотите скорость. Вот метод, который работает гораздо более эффективно. Нажмите на кнопку «Выполнить фрагмент кода» для демонстрации его в действии.

Полный список

— получаем доступ к Canvas

Наконец-то начинаем цикл уроков по графике в Android. Не прошло и двух с половиной лет с момента создания сайта.

Для начала рассмотрим обычное 2D рисование.

Для рисования используется объект Canvas. Сразу договоримся, что я буду называть его «канва». Тем более, что в русском языке даже есть такое слово, известное в узких кругах вышивающих крестиком. Можно еще, конечно, Canvas перевести как «холст» или «полотно», но как-то пафосно получается. «Канва» — проще и удобнее для меня.

Сразу скажу, что канва является лишь инструментом для рисования. А весь результат сохраняется на Bitmap. Мы не можем напрямую попросить Bitmap нарисовать на себе линию или круг, поэтому канва выступает посредником и помогает нам нарисовать то, что нужно.

В этом уроке разберем два способа получения доступа к канве.

Первый способ – через наследника View класса. Нам нужно просто переопределить его метод onDraw и он даст нам доступ к канве. Кода тут минимум и все предельно просто. Но есть недостаток – все рисование выполняется в основном потоке. Это прокатит, если у вас статичная картинка или не слишком динамичная анимация.

Второй способ – через SurfaceView. Этот способ подойдет, если планируете рисовать что-то тяжелое и динамичное. Под рисование здесь будет выделен отдельный поток. Это уже немного посложнее в реализации, чем первый способ.

Project name: P1411_CanvasView
Build Target: Android 2.3.3
Application name: CanvasView
Package name: ru.startandroid.develop.p1411canvasview
Create Activity: MainActivity

В onCreate мы в метод setContentView передаем не layout-файл, как обычно, а свой view-компонент DrawView. Он будет занимать все содержимое Activity.

Класс DrawView является наследником View и переопределяет его метод onDraw. А этот метод дает нам доступ к объекту Canvas. Пока что не будем рисовать ничего особенного, а просто закрасим все зеленым цветом с помощью метода drawColor.

Собственно, все. Готово первое приложение, которое что-то рисует на экране.

Все сохраняем, запускаем и видим результат.

Экран зеленый, как мы и просили.

Метод onDraw был вызван системой, когда возникла необходимость прорисовать View-компонент на экране. Это также произойдет, например, если выключить-включить экран. Попробуйте поставить в onDraw лог и посмотреть результат.

Если вам надо, чтобы на канве была какая-то анимация, необходимо самим постоянно вызывать перерисовку экрана, когда ваши изменения готовы к отображению. Для этого используется метод invalidate. Вызываете его и он в свою очередь вызовет onDraw. Также есть реализации метода invalidate, которые позволяет перерисовать не весь компонент, а только его часть, указав координаты.

Если нужна цикличная прорисовка, можно поместить метод invalidate прямо в onDraw и View будет постоянно перерисовываться. В некоторых уроках, думаю, будем так делать, но только для упрощения кода. А в действительности это не очень хорошая практика, т.к. это все будет идти в основном потоке. И правильнее будет реализовать такую постоянную перерисовку через SurfaceView.

Давайте посмотрим как это делается.

SurfaceView

Стало чуть сложнее, правда? ) Сейчас разберемся что к чему.

Метод onCreate, собственно, ничуть не изменился. Мы также в метод setContentView передаем наш объект DrawView.

Смотрим DrawView. Он является наследником SurfaceView и заодно реализует интерфейс обработчика SurfaceHolder.Callback. Напоминаю, что с SurfaceView мы уже работали в уроке про камеру (Урок 132). Этот компонент только отображает контент. А работа с ним ведется через обработчика SurfaceHolder.

В конструкторе DrawView мы получаем SurfaceHolder и сообщаем ему, что сами будем обрабатывать его события. Таких событий три:

surfaceChanged — был изменен формат или размер SurfaceView

surfaceCreated – SurfaceView создан и готов к отображению информации

surfaceDestroyed – вызывается перед тем, как SurfaceView будет уничтожен

В surfaceCreated мы создаем свой поток прорисовки (о нем чуть позже), передаем ему SurfaceHolder. Вызовом метода setRunning(true) ставим ему метку о том, что он может работать и стартуем его.

В surfaceDestroyed мы своему потоку сообщаем (setRunning(false)) о том, что его работа должна быть прекращена, т.к. SurfaceView сейчас будет уничтожено. Далее запускаем цикл, который ждет, пока не завершит работу наш поток прорисовки. Дождаться надо обязательно, иначе поток может попытаться нарисовать что-либо на уничтоженном SurfaceView.

DrawThread, наследник Thread, – это наш поток прорисовки. В нем и будет происходить рисование.

В конструктор передаем SurfaceHolder. Он нам нужен, чтобы добраться до канвы.

Метод setRunning ставит метку работы, сообщающую потоку, можно ли работать.

Метод run. В нем видим цикл, который выполняется пока позволяет метка работы (running). В цикле обнуляем переменную канвы, затем от SurfaceHolder получаем канву методом lockCanvas. На всякий случай проверяем, что канва не null, и можно рисовать: снова просто закрашиваем все зеленым цветом. После того, как нарисовали, что хотели, мы возвращаем канву объекту SurfaceHolder методом unlockCanvasAndPost в секции finally (обязательной для выполнения) и SurfaceView отобразит наши художества.

Соответственно, когда в surfaceDestroyed вызывается метод setRunning(false), происходит выход из цикла в методе run и поток завершает свою работу.

Все сохраняем, запускаем и видим результат.

Когда мы рассматривали первый способ получения канвы (через onDraw), я упомянул, что надо самим вызывать invalidate, если нужна постоянная перерисовка. Во втором способе ничего такого делать уже не надо. У нас итак идет постоянная перерисовка в цикле.

На этом вводный урок закончим. Мы рассмотрели два способа получения канвы. В последующих уроках я буду использовать первый способ, т.к. он проще, кода в нем значительно меньше и можно будет сосредоточиться непосредственно на работе с канвой и рисовании.

На следующем уроке:

— рисуем фигуры
— выводим текст

Присоединяйтесь к нам в Telegram:

— в канале StartAndroid публикуются ссылки на новые статьи с сайта startandroid.ru и интересные материалы с хабра, medium.com и т.п.

— в чатах решаем возникающие вопросы и проблемы по различным темам: Android, Kotlin, RxJava, Dagger, Тестирование

— ну и если просто хочется поговорить с коллегами по разработке, то есть чат Флудильня

— новый чат Performance для обсуждения проблем производительности и для ваших пожеланий по содержанию курса по этой теме

Как убрать рамку вокруг растрового изображения?

29.05.2006, 23:48
29.05.2006, 23:38 #1
#2

Хочу быть фотографом :)

Панель инструментов Reference- крайняя кнопочка с рамочкой или с клавиатуры
imageframe
Далее циферку в зависимости от того, что нужно:

0
Image frames are not displayed and not plotted.

1
Image frames are both displayed and plotted.

2
Image frames are displayed but not plotted.

Единственное, пока рамка не видна, рисунок нельзя будет выбрать!

Цукерберг рекомендует:  Работа с Google Docs средствами PHP. Поиск, загрузка и удаление документов
Понравилась статья? Поделиться с друзьями:
Все языки программирования для начинающих