Instagram растет как сумасшедший за последние несколько лет, и одна из ключевых функций, которые способствовали этому росту, - это знаменитые фотофильтры. Разрешив пользователям применять к своим фотографиям различные фильтры и улучшать их внешний вид, Instagram создал удивительный продукт. В настоящее время любое современное фото-приложение должно поддерживать фотофильтры. Итак, мы собираемся посмотреть, как реализовать фильтры фотографий Instagram в React Native.

В сегодняшней статье мы поговорим о том, как реализовать фотофильтры в Instagram. Мы собираемся использовать пакет response-native-image-filter-kit . Здесь, в Instamobile, мы используем эту библиотеку, чтобы легко встроить эту функцию фотофильтров в наш Клон Instagram.

Реализация фотофильтров Instagram в React Native

Прежде всего, давайте установим упомянутый ранее пакет в ваш проект React Native, выполнив:

npm install -s react-native-image-filter-kit

Вот простой проект React Native, который применяет фильтры фотографий Instagram к изображению, включенному в базу кода (имя изображения - «parrot.png», поэтому убедитесь, что вы включили его в папку проекта, чтобы его можно было загрузить в приложение. ). В файле App.js просто поместите следующий фрагмент кода:

import React from 'react';
import {Image, SafeAreaView} from 'react-native';
import {Emboss} from 'react-native-image-filter-kit';

const App = () => (
  <>
    <SafeAreaView />
    <Image
      style={styles.image}
      source={require('./parrot.png')}
      resizeMode={'contain'}
    />
    <Emboss
      image={
        <Image
          style={styles.image}
          source={require('./parrot.png')}
          resizeMode={'contain'}
        />
      }
    />
  </>
);

const styles = {
  image: {
    width: 320,
    height: 320,
    marginVertical: 10,
    alignSelf: 'center',
  },
};

Компонент Emboss, предоставляемый react-native-filter-kit, принимает компонент Image в качестве опоры и применяет фильтр, как показано на снимке экрана ниже:

Библиотека react-native-image-filter-kit предоставляет множество других компонентов фильтра, поэтому мы собираемся найти способ реализовать более полный фильтр, точно так же, как это делается в самом приложении Instagram.

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

import {
  AdenCompat,
  _1977Compat,
  BrannanCompat,
  BrooklynCompat,
  ClarendonCompat,
  EarlybirdCompat,
  GinghamCompat,
  HudsonCompat,
  InkwellCompat,
  KelvinCompat,
  LarkCompat,
  LofiCompat,
  MavenCompat,
  MayfairCompat,
  MoonCompat,
  NashvilleCompat,
  PerpetuaCompat,
  ReyesCompat,
  RiseCompat,
  SlumberCompat,
  StinsonCompat,
  ToasterCompat,
  ValenciaCompat,
  WaldenCompat,
  WillowCompat,
  Xpro2Compat,
} from 'react-native-image-filter-kit'; 

const FILTERS = [
  {
    title: 'Normal',
    filterComponent: AdenCompat,
  },
  {
    title: 'Maven',
    filterComponent: MavenCompat,
  },
  {
    title: 'Mayfair',
    filterComponent: MayfairCompat,
  },
  {
    title: 'Moon',
    filterComponent: MoonCompat,
  },
  {
    title: 'Nashville',
    filterComponent: NashvilleCompat,
  },
  {
    title: 'Perpetua',
    filterComponent: PerpetuaCompat,
  },
  {
    title: 'Reyes',
    filterComponent: ReyesCompat,
  },
  {
    title: 'Rise',
    filterComponent: RiseCompat,
  },
  {
    title: 'Slumber',
    filterComponent: SlumberCompat,
  },
  {
    title: 'Stinson',
    filterComponent: StinsonCompat,
  },
  {
    title: 'Brooklyn',
    filterComponent: BrooklynCompat,
  },
  {
    title: 'Earlybird',
    filterComponent: EarlybirdCompat,
  },
  {
    title: 'Clarendon',
    filterComponent: ClarendonCompat,
  },
  {
    title: 'Gingham',
    filterComponent: GinghamCompat,
  },
  {
    title: 'Hudson',
    filterComponent: HudsonCompat,
  },
  {
    title: 'Inkwell',
    filterComponent: InkwellCompat,
  },
  {
    title: 'Kelvin',
    filterComponent: KelvinCompat,
  },
  {
    title: 'Lark',
    filterComponent: LarkCompat,
  },
  {
    title: 'Lofi',
    filterComponent: LofiCompat,
  },
  {
    title: 'Toaster',
    filterComponent: ToasterCompat,
  },
  {
    title: 'Valencia',
    filterComponent: ValenciaCompat,
  },
  {
    title: 'Walden',
    filterComponent: WaldenCompat,
  },
  {
    title: 'Willow',
    filterComponent: WillowCompat,
  },
  {
    title: 'Xpro2',
    filterComponent: Xpro2Compat,
  },
  {
    title: 'Aden',
    filterComponent: AdenCompat,
  },
  {
    title: '_1977',
    filterComponent: _1977Compat,
  },
  {
    title: 'Brannan',
    filterComponent: BrannanCompat,
  },
];

Затем мы должны отобразить горизонтальный список фильтров внизу и динамически изменить изображение фильтра в качестве центрального изображения, когда фильтр выбран. Ваш файл App.js станет таким:

import React, {useRef, useState} from 'react';
import {
  FlatList,
  Image,
  SafeAreaView,
  StyleSheet,
  Text,
  TouchableOpacity,
} from 'react-native';

const App = () => {
  const extractedUri = useRef('https://www.hyundai.com/content/hyundai/ww/data/news/data/2021/0000016609/image/newsroom-0112-photo-1-2021elantranline-1120x745.jpg');
  const [selectedFilterIndex, setIndex] = useState(0);

  const onExtractImage = ({nativeEvent}) => {
    extractedUri.current = nativeEvent.uri;
  };

  const onSelectFilter = selectedIndex => {
    setIndex(selectedIndex);
  };

  const renderFilterComponent = ({item, index}) => {
    const FilterComponent = item.filterComponent;
    const image = (
      <Image
        style={styles.filterSelector}
        source={require('./car.jpg')}
        resizeMode={'contain'}
      />
    );

    return (
      <TouchableOpacity onPress={() => onSelectFilter(index)}>
        <Text style={styles.filterTitle}>{item.title}</Text>
        <FilterComponent image={image} />
      </TouchableOpacity>
    );
  };

  const SelectedFilterComponent = FILTERS[selectedFilterIndex].filterComponent;

  return (
    <>
      <SafeAreaView />
      {selectedFilterIndex === 0 ? (
        <Image
          style={styles.image}
          source={require('./car.jpg')}
          resizeMode={'contain'}
        />
      ) : (
        <SelectedFilterComponent
          onExtractImage={onExtractImage}
          extractImageEnabled={true}
          image={
            <Image
              style={styles.image}
              source={require('./car.jpg')}
              resizeMode={'contain'}
            />
          }
        />
      )}

      <FlatList
        data={FILTERS}
        keyExtractor={item => item.title}
        horizontal={true}
        renderItem={renderFilterComponent}
      />
    </>
  );
};

const styles = StyleSheet.create({
  image: {
    width: 520,
    height: 520,
    marginVertical: 10,
    alignSelf: 'center',
  },
  filterSelector: {
    width: 100,
    height: 100,
    margin: 5,
  },
  filterTitle: {
    fontSize: 12,
    textAlign: 'center',
  },
});

Этот исходный код создаст простое приложение React Native, которое поддерживает выбор различных фотофильтров Instagram, как и настоящий фоторедактор Instagram:

После выбора метод-обработчик onExtractImage сохраняет URL-адрес извлеченного изображения после выбора фильтра в переменной extractedUri ref, которую вы можете сохранить на своем сервере.

Вывод

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

Первоначально опубликовано на https://www.instamobile.io 15 апреля 2021 г.

Больше контента на plainenglish.io