Как убрать предмет на фото андроид

Как убрать предмет на фото андроид

Snapseed

Если вы не знаете, как убрать с фото лишние предметы онлайн и бесплатно, то воспользуйтесь приложением Snapseed. Это самый легкий вариант из всех представленных. Скачать абсолютно бесплатно его можно в официальных магазинах AppStore и Google Play.

Как убрать ненужный предмет с фотографии:

  1. Открыть приложение Snapseed.
  2. Нажать Инструменты-Точечная коррекция.
  3. Приблизить снимок пальцами.
  4. Осторожной тапнуть по экрану, чтобы убрать объект или предмет с фото в Snapseed.
  5. Сохранить изображение в Галерею.

Facetune

Второе приложение, которое убирает предметы на фото, называется Facetune. Программа является платной, но часто бывает на скикдах в AppStore (всего за 15 рублей). Если не хотите покупать приложение, то можете воспользоваться бесплатным аналогом Facetune 2. В нём есть точно такая же функция.

Как убрать предмет с фото на айфоне и андроиде:

  1. Открыть программу Facetune.
  2. В нижней части перейти на пункт «Заплатка».
  3. Нажать на предмет, который нужно убрать. Появится 2 круга. Первый – это зона предмета, а второй – это круг с той поверхностью, на которую можно заменить первую часть. Круги можно перемещать в любом направлении, подбирая оптимальный вариант.
  4. Точечными движениями обработать фото и сохранить его в Галерею.

Touch Retouch – это программа, которая убирает предметы на фото за считанные минуты. Но она платная, стоит 149 рублей (цена на 2018 год).

Photoshop Fix

Убрать ненужный предмет или людей с фото на телефоне поможет приложение Photoshop Fix. Оно абсолютно бесплатно доступно для скачки в официальных магазинах.

Как убрать предмет с фото через приложение:

  1. Открыть приложение Photoshop Fix.
  2. Зарегистрироваться или авторизоваться через Facebook или Google Play.
  3. Открыть нужное фото.
  4. В нижнем меню нажать на значок пластыря «Восстановление».
  5. В этой программе есть Точечное восстановление, есть Штамп, Заплатка, Эффект красных глаз и Ластик, который восстанавливает, если что-то вам не понравится.
  6. Для обработки лучше всего приблизить фото касанием пальцев.
  7. Если вы выбрали пункт «Штамп», то сначала нужно кликнуть по поверхности рядом с ненужным предметом и поставить отметку (кружочек), но там, где его нет. Именно клонированием это области мы будем убирать предмет с фото.
  8. Коснуться пальцем того элемента, который нужно удалить с фото, и аккуратно шаг за шагом стереть его.
  9. Сохранить фото в Галерею!

Union

И последняя программа, которая убирает лишние предметы с фото, называется Union. Приложение является платным и стоит 379 рублей (цена на 2019 год).

Как убрать предмет с фото в фоторедакторе:

  1. Открыть приложение Union.
  2. Для Background загрузить снимок, в котором нужно сделать изменения.
  3. Для Foreground загрузить чистое фото, где нет никаких посторонних предметов: проводов, машин, людей и т.д.
  4. Чтобы слои ровно легли друг на друга, можно убрать немного интенсивности, а после вернуть ее обратно.
  5. Нажать на Mask и Ластиком аккуратно стереть весь слой.
  6. Далее тапнуть на кисть и закрасить всё ненужное пространство.
  7. Если нужно повторить маску слоя, то необходимо нажать на Flatten и добавить фото на Foreground.
  8. Сохранить изображение в Галерею.

PageTransformer

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


...
viewPager.setCurrentItem(1); // выводим второй экран

viewPager.setPageTransformer(false, new ViewPager.PageTransformer() {
    @Override
    public void transformPage(@NonNull View v, float pos) {
        final float opacity = Math.abs(Math.abs(pos) - 1);
        v.setAlpha(opacity);
    }
});

Класс PageTransformer заслуживает отдельной статьи.

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

Изменим разметку для фрагмента (fragment_1.xml):


Создадим два строковых массива в ресурсах (res/values/strings.xml):


ВаськаБарсикМурзикРыжикВаська слушает да естБарсик хочет в БарселонуМурзик выписал МурзилкуРыжик рычит на рыбок

Теперь подготовим класс для фрагмента CatFragment:


package ru.alexanderklimov.viewpager;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;

public class CatFragment extends Fragment {
    static final String CAT_NAMES = "cats_names";
    static final String CAT_DESCRIPTIONS = "cat_descriptions";
    final static String TOP_IMAGE = "top image";

    public CatFragment() {
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_1, container, false);

        Bundle arguments = getArguments();
        if (arguments != null) {
            String catName = arguments.getString(CAT_NAMES);
            String catDescription = arguments.getString(CAT_DESCRIPTIONS);
            int topCardResourceId = arguments.getInt(TOP_IMAGE);

            displayValues(view, catName, catDescription, topCardResourceId);
        }
        return view;
    }

    private void displayValues(View v, String name,
                               String catDescription, int topCardResourceId) {
        TextView catNameTextView = v.findViewById(R.id.catTitle);
        TextView catDescriptionTextView = v.findViewById(R.id.catDescription);
        ImageView cardImageView = v.findViewById(R.id.topImage);

        catNameTextView.setText(name);
        catDescriptionTextView.setText(catDescription);

        cardImageView.setImageResource(topCardResourceId);
    }
}

При создании фрагмент извлекает данные из объекта Bundle и использует их для заполнения текстов и картинки.

Создадим класс для адаптера в отдельном файле для удобства с помощью мастера создания класса, указав в качестве суперкласса FragmentPagerAdapter.


package ru.alexanderklimov.viewpager;

import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentPagerAdapter;

public class CatPagerAdapter extends FragmentPagerAdapter {


    public CatPagerAdapter(@NonNull FragmentManager fm) {
        super(fm);
    }

    @NonNull
    @Override
    public Fragment getItem(int position) {
        return null;
    }

    @Override
    public int getCount() {
        return 0;
    }
}

У адаптера должен быть пустой конструктор и два обязательных метода getItem() и getCount(). Немного переделаем конструктор, чтобы он использовал контекст, необходимый для извлечения данных из ресурсов.


import android.content.Context;
import android.content.res.Resources;
import android.os.Bundle;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentPagerAdapter;

public class CatPagerAdapter extends FragmentPagerAdapter {

    private String[] mCatNames;
    private String[] mCatDescriptions;

    private final int[] mTopImageResourceIds = { R.drawable.cat_gold,
            R.drawable.cat_green, R.drawable.cat_white, R.drawable.cat_yellow };


    CatPagerAdapter(FragmentManager fm, Context context) {
        super(fm);

        Resources resources = context.getResources();
        mCatNames = resources.getStringArray(R.array.catsTitles);
        mCatDescriptions = resources.getStringArray(R.array.catDescriptions);
    }

    @NonNull
    @Override
    public Fragment getItem(int position) {
        Bundle arguments = new Bundle();
        arguments.putString(CatFragment.CAT_NAMES, mCatNames[position]);
        arguments.putString(CatFragment.CAT_DESCRIPTIONS,
                mCatDescriptions[position]);
        arguments.putInt(CatFragment.TOP_IMAGE, mTopImageResourceIds[position]);

        CatFragment catsFragment = new CatFragment();
        catsFragment.setArguments(arguments);

        return catsFragment;
    }

    @Override
    public int getCount() {
        return mCatNames.length;
    }

    @Nullable
    @Override
    public CharSequence getPageTitle(int position) {
        return mCatNames[position];
    }
}

Для подсчёта количества экранов используется свойство массива length. А для формирования содержимого экрана мы помещаем нужные данные в объект Bundle, которые затем будут переданы фрагменту. Данные находятся в трёх массивах: короткий текст, длинный текст и ссылка на изображение в ресурсах.

Метод getPageTitle() позволяет задать заголовок для фрагмента. Сам заголовок мы зададим в следующем шаге.

Приготовления почти закончены. Изменим разметку главной активности, чтобы у отдельного экрана появились заголовки. Для этого добавляется тег PagerTitleStrip:


Если вы хотите видеть заголовок внизу фрагмента, то используйте android:layout_gravity="bottom".

Загружаем ViewPager и подключаем адаптер.


import android.os.Bundle;

import androidx.appcompat.app.AppCompatActivity;
import androidx.viewpager.widget.ViewPager;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        CatPagerAdapter catPagerAdapter = new CatPagerAdapter(getSupportFragmentManager(), this);

        ViewPager viewPager = findViewById(R.id.viewpager);
        viewPager.setAdapter(catPagerAdapter);

    }
}

Пример на планшете в альбомной ориентации:

Свойства PagerTitleStrip можно изменить программно, например, поменять размер и цвет заголовков.


...
viewPager.setAdapter(catPagerAdapter);

PagerTitleStrip pagerTitleStrip = findViewById(R.id.pager_title_strip);
pagerTitleStrip.setTextSize(TypedValue.COMPLEX_UNIT_SP, 24);
pagerTitleStrip.setTextColor(Color.GREEN);

Тег PagerTitleStrip можно заменить на PagerTabStrip. В этом случае заголовке станут ещё и кнопками-вкладками. Ничего переписывать не придётся. Вы по-прежнему можете перелистывать страницы пальцами или нажимать на заголовки.

У ViewPager есть обработчик событий OnPageChangeListener с тремя методами:


viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

    }

    @Override
    public void onPageSelected(int position) {
        Toast.makeText(getApplicationContext(), "Выбран " + position,
                Toast.LENGTH_LONG).show();
    }

    @Override
    public void onPageScrollStateChanged(int state) {

    }
});

Например, метод onPageSelected() позволяет получить номер текущего экрана при пролистывании (отсчёт от 0).

Метод onPageScrolled() даёт представление о текущем значении скрола при пролистывании.

Метод onPageScrollStateChanged() позволяет узнать о состоянии, в котором находится скрол (SCROLL_STATE_IDLE – экраны не листаются, SCROLL_STATE_DRAGGING – пользователь «тащит» страницу, SCROLL_STATE_SETTLING – палец пользователя «доводит» страницу до конца.

Сейчас данный слушатель помечен как устаревший.

Это старый вариант примера, когда компонент только появился. Я не стал делать ревизию, оставляю вам для самостоятельного изучения.

Адаптер FragmentPagerAdapter держит все фрагменты в памяти, а FragmentStatePagerAdapter создаёт их заново по мере необходимости. В этом их принципиальное отличие. Напишем пример и добавим поддержку кнопки Back.

Создадим разметку для отдельной страницы (pager.xml):


Создадим класс фрагмента с минимальным кодом


package ru.alexanderklimov.test;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class SlideFragment extends Fragment {
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		ViewGroup rootView = (ViewGroup) inflater.inflate(
                R.layout.pager, container, false);

        return rootView;
	}
}

Разметку активности оставим минимальной:


Код для активности. Тут всё уже знакомо.


package ru.alexanderklimov.test;

import ...

public class MainActivity extends FragmentActivity {

	// Число страниц
	private static final int NUM_PAGES = 5;
	// ViewPager
	private ViewPager mViewPager;
	// Адаптер
	private PagerAdapter mPagerAdapter;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		mViewPager = (ViewPager) findViewById(R.id.pager);
		mPagerAdapter = new ScreenSlidePagerAdapter(getSupportFragmentManager());
		mViewPager.setAdapter(mPagerAdapter);
	}

	@Override
	public void onBackPressed() {
		if (mViewPager.getCurrentItem() == 0) {
			// If the user is currently looking at the first step, allow the
			// system to handle the
			// Back button. This calls finish() on this activity and pops the
			// back stack.
			super.onBackPressed();
		} else {
			// Otherwise, select the previous step.
			mViewPager.setCurrentItem(mViewPager.getCurrentItem() - 1);
		}
	}

	private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter {
		public ScreenSlidePagerAdapter(FragmentManager fm) {
			super(fm);
		}

		@Override
		public Fragment getItem(int position) {
			return new SlideFragment();
		}

		@Override
		public int getCount() {
			return NUM_PAGES;
		}
	}
}

Заключение

В Android Studio в некоторых шаблонах встречается реализация ViewPager из коробки. Недавно Гугл представила бета-версию ViewPager2, которая должна заменить старый компонент.