Skip to content

Commit

Permalink
Merge pull request #1 from nathangabriel27/ios-config
Browse files Browse the repository at this point in the history
Ios config
nathangabriel27 authored Jul 29, 2024

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
2 parents 70acae5 + ef4f812 commit e55e840
Showing 7 changed files with 1,386 additions and 13 deletions.
48 changes: 41 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,24 +1,58 @@
# rn-image-filter-convert

A React Native module to apply image filters.
`rn-image-filter-convert` is a React Native module that allows you to apply image filters directly on Android and iOS devices. This package provides functionalities to convert images to black and white and grayscale using native code for optimal performance. It is ideal for developers who want to integrate efficient image filters into their React Native mobile applications.

## Features

- **Black and White Filter:** Converts images to black and white using a smooth algorithm.
- **Grayscale Filter:** Applies a grayscale filter to convert images.
- **Multi-Platform Support:** Works on both Android and iOS.
- **Easy to Use:** Simple interface with TypeScript support for seamless integration into React Native projects.

## Installation

```sh
yarn add rn-image-filter-convert
```
```sh
npm install rn-image-filter-convert
```

## Usage

## Usage Basic Import and Use

```js
import { multiply } from 'rn-image-filter-convert';
```typescript
import { FilterSimple, FilterProps, FilterPropsResponse } from 'rn-image-filter-convert';

// ...
const applyFilter = async () => {
const base64Image = 'data:image/jpeg;base64,...'; // Your base64 string here
const filterProps: FilterProps = { data: base64Image, filter: 'blackAndWhite' };

const result = await multiply(3, 7);
try {
const response: FilterPropsResponse = await FilterSimple(filterProps);
if (response.status.status === 'success') {
console.log(response.uri); // Filtered image base64
} else {
console.error(response.status.message);
}
} catch (error) {
console.error(error);
}
};
```

## TypeScript Support

This package provides TypeScript definitions for a better development experience. Here are the TypeScript types and interfaces used in this package:

### Types and Interfaces

#### `FilterTypes`

Defines the types of filters supported by the module.

```typescript
export type FilterTypes = 'blackAndWhite' | 'shadesGray';


## Contributing

1 change: 1 addition & 0 deletions example/ios/.xcode.env
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export NODE_BINARY=/Users/nathanoliveiradev/.nvm/versions/node/v18.20.2/bin/node
1,256 changes: 1,256 additions & 0 deletions example/ios/Podfile.lock

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>
4 changes: 1 addition & 3 deletions ios/RnImageFilterConvert.mm
Original file line number Diff line number Diff line change
@@ -2,9 +2,7 @@

@interface RCT_EXTERN_MODULE(RnImageFilterConvert, NSObject)

RCT_EXTERN_METHOD(multiply:(float)a withB:(float)b
withResolver:(RCTPromiseResolveBlock)resolve
withRejecter:(RCTPromiseRejectBlock)reject)
RCT_EXTERN_METHOD(FilterSimple:(NSDictionary)filterProps resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)

+ (BOOL)requiresMainQueueSetup
{
72 changes: 69 additions & 3 deletions ios/RnImageFilterConvert.swift
Original file line number Diff line number Diff line change
@@ -1,8 +1,74 @@
@objc(RnImageFilterConvert)
class RnImageFilterConvert: NSObject {
@objc
static func requiresMainQueueSetup() -> Bool {
return false
}

@objc
func FilterSimple(_ filterProps: NSDictionary, resolver resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) {
guard let base64 = filterProps["data"] as? String, let filter = filterProps["filter"] as? String else {
reject("ERROR", "Invalid parameters", nil)
return
}

guard let image = decodeBase64ToImage(base64) else {
reject("ERROR", "Invalid base64 string", nil)
return
}

var filteredImage: UIImage

switch filter {
case "blackAndWhite":
filteredImage = applyBlackAndWhiteFilter(image: image)
case "shadesGray":
filteredImage = applyGrayscaleFilter(image: image)
default:
reject("ERROR", "Invalid filter type", nil)
return
}

let base64String = encodeImageToBase64(image: filteredImage)
let response: [String: Any] = [
"uri": base64String,
"filter": filter,
"type": "base64",
"status": [
"status": "success",
"message": NSNull()
]
]
resolve(response)
}

private func decodeBase64ToImage(_ base64: String) -> UIImage? {
guard let data = Data(base64Encoded: base64) else { return nil }
return UIImage(data: data)
}

private func encodeImageToBase64(image: UIImage) -> String {
guard let imageData = image.jpegData(compressionQuality: 1.0) else { return "" }
return imageData.base64EncodedString()
}

private func applyBlackAndWhiteFilter(image: UIImage) -> UIImage {
let context = CIContext(options: nil)
let filter = CIFilter(name: "CIPhotoEffectMono")
let ciImage = CIImage(image: image)
filter?.setValue(ciImage, forKey: kCIInputImageKey)
guard let outputImage = filter?.outputImage else { return image }
guard let cgImage = context.createCGImage(outputImage, from: outputImage.extent) else { return image }
return UIImage(cgImage: cgImage)
}

@objc(multiply:withB:withResolver:withRejecter:)
func multiply(a: Float, b: Float, resolve:RCTPromiseResolveBlock,reject:RCTPromiseRejectBlock) -> Void {
resolve(a*b)
private func applyGrayscaleFilter(image: UIImage) -> UIImage {
let context = CIContext(options: nil)
let filter = CIFilter(name: "CIPhotoEffectTonal")
let ciImage = CIImage(image: image)
filter?.setValue(ciImage, forKey: kCIInputImageKey)
guard let outputImage = filter?.outputImage else { return image }
guard let cgImage = context.createCGImage(outputImage, from: outputImage.extent) else { return image }
return UIImage(cgImage: cgImage)
}
}

0 comments on commit e55e840

Please sign in to comment.