Gathering detailed insights and metrics for react-native-compressor
Gathering detailed insights and metrics for react-native-compressor
Gathering detailed insights and metrics for react-native-compressor
Gathering detailed insights and metrics for react-native-compressor
react-native-compressor-forked
This library compress image, video and audio
@imsourajit/react-native-compressor
This library compress image, video and audio
react-native-photo-compressor
React Native Turbo Modules that allow you to compress your photos by given URI
react-native-compressor-with-h265
This library compress image, video and audio with h265 support
🗜️Compress Image, Video, and Audio same like Whatsapp 🚀✨
npm install react-native-compressor
Typescript
Module System
Min. Node Version
Node Version
NPM Version
66.5
Supply Chain
57.5
Quality
77.2
Maintenance
50
Vulnerability
94.1
License
Kotlin (40.07%)
Swift (32.36%)
TypeScript (18.12%)
Java (3.53%)
Ruby (1.63%)
Objective-C++ (1.51%)
JavaScript (1.28%)
Shell (0.79%)
Objective-C (0.68%)
C (0.04%)
Total Downloads
2,875,829
Last Day
9,508
Last Week
52,073
Last Month
204,997
Last Year
1,820,287
MIT License
1,091 Stars
363 Commits
109 Forks
9 Watchers
14 Branches
20 Contributors
Updated on May 13, 2025
Minified
Minified + Gzipped
Latest Version
1.11.0
Package Id
react-native-compressor@1.11.0
Unpacked Size
477.90 kB
Size
106.36 kB
File Count
145
NPM Version
10.1.0
Node Version
20.9.0
Published on
Mar 21, 2025
Cumulative downloads
Total Downloads
Last Day
16.4%
9,508
Compared to previous day
Last Week
13.7%
52,073
Compared to previous week
Last Month
1.3%
204,997
Compared to previous month
Last Year
158.9%
1,820,287
Compared to previous year
2
24
REACT-NATIVE-COMPRESSOR is a react-native package, which helps us to Compress Image
, Video
, and Audio
before uploading, same like Whatsapp without knowing the compression algorithm
We should use react-native-compressor instead of FFmpeg because react-native-compressor gives you same compression of Whatsapp (Image, Video, and Audio
) without knowing the algorithm of compression + it is lightweight only increase 50 KB Size Size in APK while FFmpeg increase ~> 9 MB Size in APK, and we have to give manual image/video/Audo size and quality as well as
If you find this package useful hit the star 🌟
1yarn add react-native-compressor
you can give feedback on Discord channel
expo install react-native-compressor
Add the Compressor plugin to your Expo config (app.json
, app.config.json
or app.config.js
):
1{ 2 "name": "my app", 3 "plugins": ["react-native-compressor"] 4}
Finally, compile the mods:
expo prebuild
To apply the changes, build a new binary with EAS:
eas build
Automatic linking is supported for both Android
and IOS
Note: If you are using react-native version 0.60 or higher you don't need to link this package.
1react-native link react-native-compressor
pod 'react-native-compressor', :path => '../node_modules/react-native-compressor'
into Podfile
pod install
Cmd+R
)<android/app/src/main/java/[...]/MainActivity.java
import com.reactnativecompressor.CompressorPackage;
to the imports at the top of the filenew CompressorPackage()
to the list returned by the getPackages()
methodandroid/settings.gradle
:
include ':react-native-compressor'
project(':react-native-compressor').projectDir = new File(rootProject.projectDir,'../node_modules/react-native-compressor/android')
android/app/build.gradle
:
compile project(':react-native-compressor')
1import { Image } from 'react-native-compressor'; 2 3const result = await Image.compress('file://path_of_file/image.jpg'); 4// OR 5const result = await Image.compress('https://path_of_file/image.jpg', { 6 progressDivider: 10, 7 downloadProgress: (progress) => { 8 console.log('downloadProgress: ', progress); 9 }, 10});
Here is this package comparison of images compression with WhatsApp
1import { Image } from 'react-native-compressor'; 2 3const result = await Image.compress('file://path_of_file/image.jpg', { 4 compressionMethod: 'manual', 5 maxWidth: 1000, 6 quality: 0.8, 7});
1import { Video } from 'react-native-compressor'; 2 3const result = await Video.compress( 4 'file://path_of_file/BigBuckBunny.mp4', 5 {}, 6 (progress) => { 7 console.log('Compression Progress: ', progress); 8 } 9); 10 11//OR 12 13const result = await Video.compress( 14 'https://example.com/video.mp4', 15 { 16 progressDivider: 10, 17 downloadProgress: (progress) => { 18 console.log('downloadProgress: ', progress); 19 }, 20 }, 21 (progress) => { 22 console.log('Compression Progress: ', progress); 23 } 24);
Here is this package comparison of video compression with WhatsApp
1import { Video } from 'react-native-compressor'; 2 3const result = await Video.compress( 4 'file://path_of_file/BigBuckBunny.mp4', 5 { 6 compressionMethod: 'manual', 7 }, 8 (progress) => { 9 console.log('Compression Progress: ', progress); 10 } 11);
1import { Video } from 'react-native-compressor'; 2 3let cancellationVideoId = ''; 4 5const result = await Video.compress( 6 'file://path_of_file/BigBuckBunny.mp4', 7 { 8 compressionMethod: 'auto', 9 // getCancellationId for get video id which we can use for cancel compression 10 getCancellationId: (cancellationId) => 11 (cancellationVideoId = cancellationId), 12 }, 13 (progress) => { 14 if (backgroundMode) { 15 console.log('Compression Progress: ', progress); 16 } else { 17 setCompressingProgress(progress); 18 } 19 } 20); 21 22// we can cancel video compression by calling cancelCompression with cancel video id which we can get from getCancellationId function while compression 23Video.cancelCompression(cancellationVideoId);
1import { Audio } from 'react-native-compressor'; 2 3const result = await Audio.compress( 4 'file://path_of_file/file_example_MP3_2MG.wav', // recommended wav file but can be use mp3 file 5 { quality: 'medium' } 6); 7 8// OR 9 10const result = await Audio.compress( 11 'file://path_of_file/file_example_MP3_2MG.wav', // recommended wav file but can be use mp3 file 12 { 13 bitrate: 64000, 14 samplerate: 44100, 15 channels: 1, 16 } 17);
1import { backgroundUpload } from 'react-native-compressor'; 2 3const headers = {}; 4 5const uploadResult = await backgroundUpload( 6 url, 7 fileUrl, 8 { httpMethod: 'PUT', headers }, 9 (written, total) => { 10 console.log(written, total); 11 } 12); 13 14//OR 15 16const uploadResult = await backgroundUpload( 17 url, 18 fileUrl, 19 { uploadType: UploadType.MULTIPART, httpMethod: 'POST', headers }, 20 (written, total) => { 21 console.log(written, total); 22 } 23);
for cancellation Upload, there is two ways
1import { cancelUpload, backgroundUpload } from 'react-native-compressor'; 2 3// if we will call without passing any param then it will remove last pushed uploading 4cancelUpload() 5 6// if you pass true as second param then it will cancel all the uploading 7cancelUpload("",true) 8 9// if there is multiple files are uploading, and you wanna cancel specific uploading then you pass specific video id like this 10let videoId='' 11const uploadResult = await backgroundUpload( 12 url, 13 fileUrl, 14 { httpMethod: 'PUT', getCancellationId: (cancellationId) =>(videoId = cancellationId), }, 15 (written, total) => { 16 console.log(written, total); 17 } 18); 19cancelUpload(videoId)
1import { backgroundUpload } from 'react-native-compressor'; 2 3const abortSignalRef = useRef(new AbortController()); 4 5const uploadResult = await backgroundUpload( 6 url, 7 fileUrl, 8 { httpMethod: 'PUT' }, 9 (written, total) => { 10 console.log(written, total); 11 }, 12 abortSignalRef.current.signal 13); 14 15abortSignalRef.current?.abort(); // this will cancel uploading
1import { download } from 'react-native-compressor'; 2 3const downloadFileUrl = await download(url, (progress) => { 4 console.log('downloadProgress: ', progress); 5});
1import { createVideoThumbnail, clearCache } from 'react-native-compressor'; 2 3const thumbnail = await createVideoThumbnail(videoUri); 4 5await clearCache(); // this will clear cache of thumbnails cache directory
compress(value: string, options?: CompressorOptions): Promise<string>
Compresses the input file URI or base-64 string with the specified options. Promise returns a string after compression has completed. Resizing will always keep the original aspect ratio of the image, the maxWidth
and maxHeight
are used as a boundary.
compressionMethod: compressionMethod
(default: "auto")if you want to compress images like whatsapp then make this prop auto
. Can be either manual
or auto
, defines the Compression Method.
downloadProgress?: (progress: number) => void;
it is callback, only trigger when we pass image url from server
progressDivider?: number
(default: 0)we uses it when we use downloadProgress
maxWidth: number
(default: 1280)The maximum width boundary used as the main boundary in resizing a landscape image.
maxHeight: number
(default: 1280)The maximum height boundary used as the main boundary in resizing a portrait image.
quality: number
(default: 0.8)The quality modifier for the JPEG
and PNG
file format, if your input file is JPEG
and output file is PNG
then compressed size can be increase
input: InputType
(default: uri)Can be either uri
or base64
, defines the contentents of the value
parameter.
output: OutputType
(default: jpg)The quality modifier for the JPEG
file format, can be specified when output is PNG
but will be ignored. if you wanna apply quality modifier then you can enable disablePngTransparency:true
,
Note: if you png image have no transparent background then enable disablePngTransparency:true
modifier is recommended
disablePngTransparency: boolean
(default: false)when user add output:'png'
then by default compressed image will have transparent background, and quality will be ignored, if you wanna apply quality then you have to disablePngTransparency like disablePngTransparency:true
, it will convert transparent background to white
returnableOutputType: ReturnableOutputType
(default: uri)Can be either uri
or base64
, defines the Returnable output image format.
if you wanna get image metadata (exif) then read this
compress(url: string, options?: videoCompresssionType , onProgress?: (progress: number)): Promise<string>
cancelCompression(cancellationId: string): void
we can get cancellationId from getCancellationId
which is the callback method of compress method options
activateBackgroundTask(onExpired?: (data: any) => void): Promise<any>
if you wanna compress video while app is in backgroup then you should call this method before compression
deactivateBackgroundTask(): Promise<any>
if you call activateBackgroundTask
method, then after video compression, you should call deactivateBackgroundTask
for disable background task mode.
getCancellationId: function
getCancellationId
is a callback function that gives us compress video id, which can be used in Video.cancelCompression
method to cancel the compression
compressionMethod: compressionMethod
(default: "manual")if you want to compress videos like whatsapp then make this prop auto
. Can be either manual
or auto
, defines the Compression Method.
downloadProgress?: (progress: number) => void;
it is callback, only trigger when we pass image url from server
progressDivider?: number
(default: 0)we uses it when we use downloadProgress/onProgress
maxSize: number
(default: 640)The maximum size can be height in case of portrait video or can be width in case of landscape video.
bitrate: number
bitrate of video which reduce or increase video size. if compressionMethod will auto then this prop will not work
minimumFileSizeForCompress: number
(default: 0)previously default was 16 but now it is 0 by default. 0 mean 0mb. This is an offset, which you can set for minimumFileSizeForCompress will allow this package to dont compress less than or equal to minimumFileSizeForCompress
ref #26
if you wanna get video metadata then read this
compress(url: string, options?: audioCompresssionType): Promise<string>
wav
file as we convert mp3 to wav then apply bitratequality?: qualityType
(default: medium)we can also control bitrate through quality. qualityType can be low
| medium
| high
bitrate?: number
Range [64000-320000]we can control bitrate of audio through bitrate, it should be in the range of 64000-320000
samplerate?: number
Range [44100 - 192000]we can control samplerate of audio through samplerate, it should be in the range of 44100 - 192000
channels?: number
Typically 1 or 2we can control channels of audio through channels, Typically 1 or 2
UploaderOptions
1export enum UploadType { 2 BINARY_CONTENT = 0, 3 MULTIPART = 1, 4} 5 6export enum UploaderHttpMethod { 7 POST = 'POST', 8 PUT = 'PUT', 9 PATCH = 'PATCH', 10} 11 12export declare type HTTPResponse = { 13 status: number; 14 headers: Record<string, string>; 15 body: string; 16}; 17 18export declare type HttpMethod = 'POST' | 'PUT' | 'PATCH'; 19 20export declare type UploaderOptions = ( 21 | { 22 uploadType?: UploadType.BINARY_CONTENT; 23 mimeType?: string; 24 } 25 | { 26 uploadType: UploadType.MULTIPART; 27 fieldName?: string; 28 mimeType?: string; 29 parameters?: Record<string, string>; 30 } 31) & { 32 headers?: Record<string, string>; 33 httpMethod?: UploaderHttpMethod; 34 getCancellationId?: (cancellationId: string) => void; 35};
Note: some of the uploader code is borrowed from Expo I tested file uploader on this backend Nodejs-File-Uploader
for cancellation Upload, there is two ways, you can use one of it
const abortSignalRef = useRef(new AbortController());
abortSignalRef.current?.abort();
it will save the thumbnail of the video into the cache directory and return the thumbnail URI which you can display
it will clear the cache that was created from createVideoThumbnail, in future this clear cache will be totally customized
if you want to get metadata of video than you can use this function
1import { getVideoMetaData } from 'react-native-compressor'; 2 3const metaData = await getVideoMetaData(filePath);
{
"duration": 20.11,
"extension": "mp4",
"height": 1080,
"size": 16940.0,
"width": 1920
}
getVideoMetaData(path: string)
if you want to get metadata of video than you can use this function
1import { getImageMetaData } from 'react-native-compressor'; 2 3const metaData = await getImageMetaData(filePath);
{
"ImageWidth": 4032,
"ImageHeight": 3024,
"Orientation": 3,
"size": 4127057,
"extension": "jpg",
"exif":{...}
}
getImageMetaData(path: string)
if you want to convert
content://
to file:///
for androidph://
to file:///
for IOSthen you can call getRealPath
function like this
1import { getRealPath } from 'react-native-compressor'; 2 3const realPath = await getRealPath(fileUri, 'video'); // file://file_path.extension
getRealPath(path: string, type: string = 'video'|'image')
if you wanna make random file path in cache folder then you can use this method like this
1import { generateFilePath } from 'react-native-compressor'; 2 3const randomFilePathForSaveFile = await generateFilePath('mp4'); // file://file_path.mp4
generateFilePath(fileextension: string)
Whatsapp: compresses Images,Videos and Audios in every effect way
See the contributing guide to learn how to contribute to the repository and the development workflow.
MIT
No vulnerabilities found.
No security vulnerabilities found.