react-avatar-editor vs react-avatar vs react-gravatar
React Avatar Libraries Comparison
1 Year
react-avatar-editorreact-avatarreact-gravatarSimilar Packages:
What's React Avatar Libraries?

These libraries provide various functionalities for handling user avatars in React applications. They cater to different needs, from simple avatar display to advanced editing capabilities. Each library has its unique features that can enhance user experience and interface design, making it easier for developers to integrate avatar functionalities into their applications.

Package Weekly Downloads Trend
Github Stars Ranking
Stat Detail
Package
Downloads
Stars
Size
Issues
Publish
License
react-avatar-editor204,8322,41357.4 kB27a year agoMIT
react-avatar60,594649146 kB25-MIT
react-gravatar27,822279-128 years agoMIT
Feature Comparison: react-avatar-editor vs react-avatar vs react-gravatar

Avatar Display

  • react-avatar-editor:

    react-avatar-editor focuses on avatar editing rather than just display. It allows users to crop and resize images, providing a more interactive experience when setting up their avatar, but does not directly handle avatar display without additional implementation.

  • react-avatar:

    react-avatar provides a simple way to display user avatars with options for size, shape, and fallback images. It allows for easy customization of styles, making it versatile for various UI designs.

  • react-gravatar:

    react-gravatar fetches and displays Gravatar images based on the user's email address. It simplifies the process of integrating Gravatar into your application, ensuring that users have a consistent avatar across different platforms.

Customization Options

  • react-avatar-editor:

    react-avatar-editor provides extensive customization options for image cropping and scaling, allowing users to adjust their avatars precisely before saving. This level of customization enhances user engagement and satisfaction.

  • react-avatar:

    This package offers basic customization options such as shape (circle or square), size, and color for fallback images, making it easy to adapt to different design requirements.

  • react-gravatar:

    Customization is limited to Gravatar settings, as the package pulls images directly from the Gravatar service. Users can customize their Gravatar profiles on the Gravatar website, but the package itself does not offer additional customization features.

User Interaction

  • react-avatar-editor:

    User interaction is a core feature of react-avatar-editor, allowing users to upload, crop, and adjust their avatars. This package is ideal for applications that prioritize user engagement and personalization.

  • react-avatar:

    User interaction is minimal with react-avatar, as it primarily focuses on displaying avatars without additional functionality. It is suitable for applications where user interaction with avatars is not required.

  • react-gravatar:

    User interaction is limited to the initial setup of Gravatar accounts. Once set up, the avatars are automatically fetched based on the user's email, requiring minimal interaction from the user.

Integration Complexity

  • react-avatar-editor:

    react-avatar-editor may require more setup due to its advanced features, but it provides a comprehensive solution for applications needing avatar editing capabilities.

  • react-avatar:

    react-avatar is easy to integrate into any React application, requiring minimal setup and configuration, making it suitable for quick implementations.

  • react-gravatar:

    react-gravatar is straightforward to integrate, especially for applications already using Gravatar. It requires only the user's email to fetch the corresponding avatar.

Use Cases

  • react-avatar-editor:

    Ideal for applications that allow users to upload and customize their avatars, such as profile management systems or user settings pages.

  • react-avatar:

    Best suited for applications that need to display user avatars without complex interactions, such as social media platforms or user profile sections.

  • react-gravatar:

    Perfect for applications that want to leverage Gravatar for user profiles, such as forums or comment sections where users are identified by their email addresses.

How to Choose: react-avatar-editor vs react-avatar vs react-gravatar
  • react-avatar-editor:

    Opt for react-avatar-editor when you require a robust solution for avatar editing, including cropping and resizing features. This package is suitable for applications that allow users to upload and customize their avatars before display, providing a more interactive experience.

  • react-avatar:

    Choose react-avatar if you need a simple and straightforward way to display user avatars with support for fallback images and customizable styles. It is ideal for applications where user avatars are static or require minimal interaction.

  • react-gravatar:

    Select react-gravatar if your application relies on Gravatar for user avatars. This package simplifies the integration of Gravatar images based on user email addresses, making it perfect for applications that want to leverage the Gravatar ecosystem for user profiles.

README for react-avatar-editor

react-avatar-editor

npm version Downloads Build Status

Facebook like, avatar / profile picture component. Resize, crop and rotate your uploaded image using a clear user interface.

Install

Just use yarn or npm to add it to your project:

yarn add react-avatar-editor

respective

npm install --save react-avatar-editor

Demo

Demo

Usage

import React from 'react'
import AvatarEditor from 'react-avatar-editor'

class MyEditor extends React.Component {
  render() {
    return (
      <AvatarEditor
        image="http://example.com/initialimage.jpg"
        width={250}
        height={250}
        border={50}
        color={[255, 255, 255, 0.6]} // RGBA
        scale={1.2}
        rotate={0}
      />
    )
  }
}

export default MyEditor

Props

| Prop | Type | Description | | ---------------------- | ---------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | image | String|File | The URL of the image to use, or a File (e.g. from a file input). | | width | Number | The total width of the editor. | | height | Number | The total height of the editor. | | border | Number|Number[] | The cropping border. Image will be visible through the border, but cut off in the resulting image. Treated as horizontal and vertical borders when passed an array. | | borderRadius | Number | The cropping area border radius. | | color | Number[] | The color of the cropping border, in the form: [red (0-255), green (0-255), blue (0-255), alpha (0.0-1.0)]. | | backgroundColor | String | The background color of the image if it's transparent. | | style | Object | Styles for the canvas element. | | scale | Number | The scale of the image. You can use this to add your own resizing slider. | | position | Object | The x and y co-ordinates (in the range 0 to 1) of the center of the cropping area of the image. Note that if you set this prop, you will need to keep it up to date via onPositionChange in order for panning to continue working. | | rotate | Number | The rotation degree of the image. You can use this to rotate image (e.g 90, 270 degrees). | | crossOrigin | String | The value to use for the crossOrigin property of the image, if loaded from a non-data URL. Valid values are "anonymous" and "use-credentials". See this page for more information. | | className | String|String[] | className property passed to the canvas element | | onLoadFailure(event) | function | Invoked when an image (whether passed by props or dropped) load fails. | | onLoadSuccess(imgInfo) | function | Invoked when an image (whether passed by props or dropped) load succeeds. | | onImageReady(event) | function | Invoked when the image is painted on the canvas the first time. | | onMouseUp() | function | Invoked when the user releases their mouse button after interacting with the editor. | | onMouseMove(event) | function | Invoked when the user hold and moving the image. | | onImageChange() | function | Invoked when the user changed the image. Not invoked on the first render, and invoked multiple times during drag, etc. | | onPositionChange() | function | Invoked when the user pans the editor to change the selected area of the image. Passed a position object in the form { x: 0.5, y: 0.5 } where x and y are the relative x and y coordinates of the center of the selected area. | | disableBoundaryChecks | Boolean | Set to true to allow the image to be moved outside the cropping boundary. | | disableHiDPIScaling | Boolean | Set to true to disable devicePixelRatio based canvas scaling. Can improve perfermance of very large canvases on mobile devices. |

Accessing the resulting image

The resulting image will have the same resolution as the original image, regardless of the editor's size. If you want the image sized in the dimensions of the canvas you can use getImageScaledToCanvas.

import React from 'react'
import AvatarEditor from 'react-avatar-editor'

class MyEditor extends React.Component {
  onClickSave = () => {
    if (this.editor) {
      // This returns a HTMLCanvasElement, it can be made into a data URL or a blob,
      // drawn on another canvas, or added to the DOM.
      const canvas = this.editor.getImage()

      // If you want the image resized to the canvas size (also a HTMLCanvasElement)
      const canvasScaled = this.editor.getImageScaledToCanvas()
    }
  }

  setEditorRef = (editor) => (this.editor = editor)

  render() {
    return (
      <AvatarEditor
        ref={this.setEditorRef}
        image="http://example.com/initialimage.jpg"
        width={250}
        height={250}
        border={50}
        scale={1.2}
      />
    )
  }
}

export default MyEditor

Adding drag and drop

We recommend using react-dropzone. It allows you to add drag and drop support to anything really easy. Here is an example how to use it with react-avatar-editor:

import React from 'react'
import AvatarEditor from 'react-avatar-editor'
import Dropzone from 'react-dropzone'

class MyEditor extends React.Component {
  state = {
    image: 'http://example.com/initialimage.jpg',
  }

  handleDrop = (dropped) => {
    this.setState({ image: dropped[0] })
  }

  render() {
    return (
      <Dropzone
        onDrop={this.handleDrop}
        noClick
        noKeyboard
        style={{ width: '250px', height: '250px' }}
      >
        {({ getRootProps, getInputProps }) => (
          <div {...getRootProps()}>
            <AvatarEditor width={250} height={250} image={this.state.image} />
            <input {...getInputProps()} />
          </div>
        )}
      </Dropzone>
    )
  }
}

Accessing the cropping rectangle

Sometimes you will need to get the cropping rectangle (the coordinates of the area of the image to keep), for example in case you intend to perform the actual cropping server-side.

getCroppingRect() returns an object with four properties: x, y, width and height; all relative to the image size (that is, comprised between 0 and 1). It is a method of AvatarEditor elements, like getImage().

Note that: getImage() returns a canvas element and if you want to use it in src attribute of img, convert it into a blob url.

const canvas = this.editor.getImage().toDataURL();
let imageURL;
fetch(canvas)
  .then(res => res.blob())
  .then(blob => (imageURL = window.URL.createObjectURL(blob)));

// Usage
<img src={imageURL} ... />

Contributing

For development you can use following build tools:

  • npm run build: Builds the minified dist file: dist/index.js
  • npm run watch: Watches for file changes and builds unminified into: dist/index.js
  • npm run demo:build: Builds the demo based on the dist file dist/index.js
  • npm run demo:watch: Run webpack-dev-server. Check demo website localhost:8080

Kudos

Kudos and thanks to danlee for the imporant work & many contributions to this project! Also thanks to oyeanuj, mtlewis and hu9o and all other awesome people contributing to this.