app/src/BookScanner.App.csproj
+1
-1
diff --git a/app/src/BookScanner.App.csproj b/app/src/BookScanner.App.csproj
index c9cc274..2a3e2ab 100644
@@ -2,7 +2,7 @@
<PropertyGroup>
<RootNamespace>BookScanner.App</RootNamespace>
<AssemblyName>BookScanner.App</AssemblyName>
<OutputType>WinExe</OutputType>
<OutputType>Exe</OutputType>
<NoWarn>AVLN3001</NoWarn>
<ApplicationManifest>app.manifest</ApplicationManifest>
<AvaloniaUseCompiledBindingsByDefault>true</AvaloniaUseCompiledBindingsByDefault>
app/src/Controls/CameraPageControl.axaml
+2
-2
diff --git a/app/src/Controls/CameraPageControl.axaml b/app/src/Controls/CameraPageControl.axaml
index bdfc84e..8594f76 100644
@@ -10,8 +10,8 @@
d:DesignHeight="450"
x:Class="BookScanner.App.Controls.CameraPageControl"
>
<Grid RowDefinitions="Auto,*">
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center" Grid.Row="0">
<Grid RowDefinitions="Auto,*" RowSpacing="4">
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center" Grid.Row="0" Spacing="4">
<ComboBox Name="cameraSelector" SelectionChanged="OnCameraSelectionChange">
<ComboBox.ItemTemplate>
<DataTemplate x:DataType="services:CameraInfo">
app/src/Controls/CameraPageControl.axaml.cs
+3
-0
diff --git a/app/src/Controls/CameraPageControl.axaml.cs b/app/src/Controls/CameraPageControl.axaml.cs
index bac1d2e..6bb0aca 100644
@@ -28,6 +28,8 @@ public partial class CameraPageControl : UserControl
}
}
public SKBitmap? Image { get; private set; }
private int rotation = 0;
private SKBitmap? rotatedBitmap;
private CameraInfo? subscribedCamera;
@@ -68,6 +70,7 @@ public partial class CameraPageControl : UserControl
surface.DrawBitmap(bitmap, -(bitmap.Width - width) / 2, -(bitmap.Height - height) / 2);
bitmap = rotatedBitmap;
}
Image = bitmap;
Dispatcher.Invoke(() =>
{
app/src/Pages/RecordingPage.axaml
+16
-1
diff --git a/app/src/Pages/RecordingPage.axaml b/app/src/Pages/RecordingPage.axaml
index d1e4264..462a9c0 100644
@@ -12,8 +12,23 @@
<ContentPage.Header>
<TextBlock Name="projectName" />
</ContentPage.Header>
<Grid RowDefinitions="*,Auto" ColumnDefinitions="*,*">
<Grid RowDefinitions="*,Auto" ColumnDefinitions="*,*" RowSpacing="4">
<controls:CameraPageControl Name="leftCameraPage" Side="Left" Grid.Row="0" Grid.Column="0" />
<controls:CameraPageControl Name="rightCameraPage" Side="Right" Grid.Row="0" Grid.Column="1" />
<StackPanel
Grid.Row="1"
Grid.ColumnSpan="2"
HorizontalAlignment="Center"
Orientation="Horizontal"
Spacing="4"
>
<Button Click="OnCaptureClick">Capture</Button>
<Button Click="OnRecaptureClick">Recapture</Button>
<TextBlock VerticalAlignment="Center">
<Run>Page:</Run>
<Run Name="pageCounter" FontFeatures="+tnum">000</Run>
</TextBlock>
</StackPanel>
</Grid>
</ContentPage>
app/src/Pages/RecordingPage.axaml.cs
+45
-0
diff --git a/app/src/Pages/RecordingPage.axaml.cs b/app/src/Pages/RecordingPage.axaml.cs
index 6cb9c87..e96b9a5 100644
@@ -1,12 +1,17 @@
using System.Threading.Tasks;
using System.Web;
using Avalonia.Controls;
using Avalonia.Interactivity;
using Avalonia.Platform.Storage;
using SkiaSharp;
namespace BookScanner.App.Pages;
public partial class RecordingPage : ContentPage
{
private readonly IStorageFolder projectFolder;
private int page = 0;
private int attempt = 0;
public RecordingPage(IStorageFolder projectFolder)
{
@@ -16,4 +21,44 @@ public partial class RecordingPage : ContentPage
this.projectFolder = projectFolder;
projectName.Text = HttpUtility.UrlDecode(projectFolder.Path.Segments[^1].Trim('/'));
}
private async void OnCaptureClick(object? sender, RoutedEventArgs args)
{
pageCounter.Text = (++page).ToString("D3");
attempt = 0;
var images = await projectFolder.GetFolderAsync("images");
await CaptureAttempt(images!);
}
private async void OnRecaptureClick(object? sender, RoutedEventArgs args)
{
attempt++;
var images = await projectFolder.GetFolderAsync("images");
await CaptureAttempt(images!);
}
private async Task CaptureAttempt(IStorageFolder images)
{
var leftTask = SaveLeft(images);
await SaveRight(images);
await leftTask;
}
private async Task SaveLeft(IStorageFolder images)
{
using var image = SKImage.FromBitmap(leftCameraPage.Image);
using var encoded = image.Encode(SKEncodedImageFormat.Png, 100);
var file = await images!.CreateFileAsync($"{page:D3}-{attempt:D1}L.png");
using var stream = await file!.OpenWriteAsync();
encoded.SaveTo(stream);
}
private async Task SaveRight(IStorageFolder images)
{
using var image = SKImage.FromBitmap(rightCameraPage.Image);
using var encoded = image.Encode(SKEncodedImageFormat.Png, 100);
var file = await images!.CreateFileAsync($"{page:D3}-{attempt:D1}R.png");
using var stream = await file!.OpenWriteAsync();
encoded.SaveTo(stream);
}
}