Skip to content

Commit 4253a2d

Browse files
committed
Get Image form camera or gallery
1 parent edaf3d7 commit 4253a2d

File tree

6 files changed

+144
-4
lines changed

6 files changed

+144
-4
lines changed

src/app/app.imports.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
import { IonicOfficialComponentsPage } from '../pages/ionic-official-components/ionic-official-components';
2-
import { ChartsPage } from '../pages/miscellaneous/charts/charts';
31
// Global state (used for theming)
42
import { AppState } from './app.global';
53

64
// Home Page
75
import { HomePage } from '../pages/_home/home';
86

7+
import { IonicOfficialComponentsPage } from '../pages/ionic-official-components/ionic-official-components';
8+
99
// Theme
1010
import { ThemingPage } from '../pages/theming/theming';
1111

@@ -82,11 +82,14 @@ import { ChatsPage } from '../pages/miscellaneous/chat/chats';
8282
import { BlogPostPage } from '../pages/miscellaneous/blog-post/blog-post';
8383
import { CreditCardScanPage } from '../pages/miscellaneous/credit-card-scan/credit-card-scan';
8484
import { RuntimePermissionsPage } from '../pages/miscellaneous/runtime-permissions/runtime-permissions';
85+
import { ChartsPage } from '../pages/miscellaneous/charts/charts';
86+
import { GetImagePage } from '../pages/miscellaneous/get-image/get-image';
8587

8688
// Providers
8789
import { WeatherService } from '../pages/miscellaneous/weather/weather.service';
8890
import { ToastService } from '../providers/util/toast.service';
8991
import { AlertService } from '../providers/util/alert.service';
92+
import { CameraProvider } from '../providers/util/camera.provider';
9093

9194
// Directives
9295
import { Timer } from '../components/countdown-timer/timer';
@@ -162,7 +165,7 @@ export const Pages = [
162165
BlogPostPage,
163166
ChartsPage,
164167
RuntimePermissionsPage,
165-
168+
GetImagePage,
166169

167170
// Modals
168171
PopupModalsPage,
@@ -194,7 +197,7 @@ export const Pipes = [
194197
]
195198

196199
export const Providers = [
197-
WeatherService, AlertService, ToastService, AppState
200+
WeatherService, AlertService, ToastService, AppState, CameraProvider
198201
]
199202

200203
export const Directives = [
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<ion-header>
2+
<ion-navbar>
3+
<ion-title>Get Image</ion-title>
4+
</ion-navbar>
5+
</ion-header>
6+
<ion-content padding>
7+
<ion-avatar (click)="changePicture()">
8+
<img [src]="chosenPicture || placeholder" onerror="this.src='assets/img/avatar/girl-avatar.png'" />
9+
<button ion-button color="danger">Change image</button>
10+
</ion-avatar>
11+
</ion-content>
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
page-get-image {
2+
ion-content {
3+
text-align: center;
4+
}
5+
ion-avatar img,
6+
ion-thumbnail img {
7+
display: block;
8+
margin: 0 auto;
9+
width: 25vh;
10+
height: auto;
11+
}
12+
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
import { CameraProvider } from '../../../providers/util/camera.provider';
2+
import { Component } from '@angular/core';
3+
import { NavController, Platform, ActionSheetController, LoadingController } from 'ionic-angular';
4+
5+
@Component({
6+
selector: 'page-get-image',
7+
templateUrl: 'get-image.html'
8+
})
9+
export class GetImagePage {
10+
11+
placeholder = 'assets/img/avatar/girl-avatar.png';
12+
chosenPicture: any;
13+
14+
constructor(public navCtrl: NavController, public actionsheetCtrl: ActionSheetController,
15+
public cameraProvider: CameraProvider, public platform: Platform, public loadingCtrl: LoadingController) {
16+
}
17+
18+
changePicture() {
19+
let loading = this.loadingCtrl.create();
20+
21+
let actionSheet = this.actionsheetCtrl.create({
22+
title: 'Upload picture',
23+
cssClass: 'action-sheets-basic-page',
24+
buttons: [
25+
{
26+
text: 'Camera',
27+
icon: !this.platform.is('ios') ? 'camera' : null,
28+
handler: () => {
29+
loading.present();
30+
return this.cameraProvider.getPictureFromCamera().then(picture => {
31+
if (picture) {
32+
this.chosenPicture = picture;
33+
}
34+
loading.dismiss();
35+
}, error => {
36+
alert(error);
37+
});
38+
}
39+
},
40+
{
41+
text: !this.platform.is('ios') ? 'Gallery' : 'Camera Roll',
42+
icon: !this.platform.is('ios') ? 'image' : null,
43+
handler: () => {
44+
loading.present();
45+
return this.cameraProvider.getPictureFromPhotoLibrary().then(picture => {
46+
if (picture) {
47+
this.chosenPicture = picture;
48+
}
49+
loading.dismiss();
50+
}, error => {
51+
alert(error);
52+
});
53+
}
54+
},
55+
{
56+
text: 'Cancel',
57+
icon: !this.platform.is('ios') ? 'close' : null,
58+
role: 'destructive',
59+
handler: () => {
60+
console.log('The user has cancelled the interaction.');
61+
}
62+
}
63+
]
64+
});
65+
return actionSheet.present();
66+
}
67+
}

src/pages/miscellaneous/miscellaneous.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { GetImagePage } from './get-image/get-image';
12
import { ChartsPage } from './charts/charts';
23
import { CreditCardScanPage } from './credit-card-scan/credit-card-scan';
34
import { BlogPostPage } from './blog-post/blog-post';
@@ -43,6 +44,10 @@ export class MiscellaneousListPage {
4344
title: 'Credit Card Scanner',
4445
page: CreditCardScanPage
4546
},
47+
{
48+
title: 'Get image from camera/gallery',
49+
page: GetImagePage
50+
},
4651
// {
4752
// title: 'Currency Converter',
4853
// page: CurrencyConverterPage

src/providers/util/camera.provider.ts

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import { Injectable } from '@angular/core';
2+
import { Camera } from 'ionic-native';
3+
4+
@Injectable()
5+
export class CameraProvider {
6+
7+
constructor() {
8+
}
9+
10+
getPictureFromCamera() {
11+
return this.getImage(Camera.PictureSourceType.CAMERA, true);
12+
}
13+
14+
getPictureFromPhotoLibrary() {
15+
return this.getImage(Camera.PictureSourceType.PHOTOLIBRARY, true);
16+
}
17+
18+
// This method takes optional parameters to make it more customizable
19+
getImage(pictureSourceType, crop = false, quality = 50, allowEdit = true, saveToAlbum = true) {
20+
let options = {
21+
quality: quality,
22+
destinationType: Camera.DestinationType.DATA_URL,
23+
sourceType: pictureSourceType,
24+
allowEdit: allowEdit,
25+
encodingType: Camera.EncodingType.PNG,
26+
saveToPhotoAlbum: saveToAlbum
27+
};
28+
29+
// If set to crop, restricts the image to a square of 600 by 600
30+
if (crop) {
31+
options["targetWidth"] = 600;
32+
options["targetHeight"] = 600;
33+
}
34+
35+
return Camera.getPicture(options).then(imageData => {
36+
let base64Image = 'data:image/png;base64,' + imageData;
37+
return base64Image;
38+
}, error => {
39+
console.log("CAMERA ERROR -> " + JSON.stringify(error));
40+
});
41+
}
42+
}

0 commit comments

Comments
 (0)