2017-04-30 77 views
0

所以基本上我需要製作一個應用程序,適合在正方形牆上的框架中的繪畫。我正在使用aforge檢測廣場,並找到了我放置的角落,並調整了我想要的幀的圖像大小。這是通過按下觸發imageAdapt()方法的第三個按鈕來完成的。不幸的是,圖像沒有重新調整到合適的尺寸,並且放置錯誤。這裏是我的代碼:c#在另一個圖像中檢測到的正方形中的圖像

namespace MyFirstJob 
{ 
public sealed partial class MainPage : Page 
{ 
    public static int a = -1; 
    public static int b = -1; 
    FolderPicker folderPicker1 = new Windows.Storage.Pickers.FolderPicker(); 
    FolderPicker folderPicker2 = new Windows.Storage.Pickers.FolderPicker(); 
    StorageFolder folder1; 
    StorageFolder folder2; 
    System.Collections.Generic.IReadOnlyList<StorageFile> filesList1; 
    System.Collections.Generic.IReadOnlyList<StorageFile> filesList2; 

    public MainPage() 
    { 
     InitializeComponent(); 
     folderPicker1.FileTypeFilter.Add(".png"); 
     folderPicker2.FileTypeFilter.Add(".png"); 
    } 

    private async void button1_Click(object sender, RoutedEventArgs e) 
    { 
     a++; 
     folder1 = await folderPicker1.PickSingleFolderAsync(); 
     filesList1 = await folder1.GetFilesAsync(); 
     var stream = await 
     filesList1[a].OpenAsync(Windows.Storage.FileAccessMode.Read); 
     var bitmapImage = new Windows.UI.Xaml.Media.Imaging.BitmapImage(); 
     await bitmapImage.SetSourceAsync(stream); 
     image1.Source = bitmapImage; 
    } 

    private async void button2_Click(object sender, RoutedEventArgs e) 
    { 
     b++; 
     folder2 = await folderPicker2.PickSingleFolderAsync(); 
     filesList2 = await folder2.GetFilesAsync(); 
     var stream = await 
     filesList2[b].OpenAsync(Windows.Storage.FileAccessMode.Read); 
     var bitmapImage = new Windows.UI.Xaml.Media.Imaging.BitmapImage(); 
     await bitmapImage.SetSourceAsync(stream); 
     image2.Source = bitmapImage; 
    } 

    private async void adaptImage() 
    { 
     var stream = await 
     filesList1[a].OpenAsync(Windows.Storage.FileAccessMode.Read); 
     BitmapDecoder decoder = await BitmapDecoder.CreateAsync(stream); 
     WriteableBitmap writableBitmap = new 
     WriteableBitmap((int)decoder.PixelWidth, (int)decoder.PixelHeight); 
     writableBitmap.SetSource(stream); 
     BlobCounter blobCounter = new BlobCounter(); 
     blobCounter.MinHeight = 100; 
     blobCounter.MinWidth = 100; 
     blobCounter.MaxHeight = 600; 
     blobCounter.MaxWidth = 600; 
     blobCounter.ProcessImage((Bitmap)writableBitmap); 
     Blob[] blobs = blobCounter.GetObjectsInformation(); 

     SimpleShapeChecker shapeChecker = new SimpleShapeChecker(); 

     foreach (var blob in blobs) 
     { 
      List<IntPoint> edgePoints = 
      blobCounter.GetBlobsEdgePoints(blob); 
      List<IntPoint> cornerPoints; 

      if (shapeChecker.IsQuadrilateral(edgePoints, out cornerPoints)) 
      { 
       if (shapeChecker.CheckPolygonSubType(cornerPoints) == PolygonSubType.Square) 
       { 

        double lenght = getLenght(cornerPoints[0].X, 
       cornerPoints[0].Y, cornerPoints[1].X, cornerPoints[1].Y); 
        image2.Height = lenght; 
        image2.Width = lenght; 
        image2.Margin = new Thickness(cornerPoints[0].X, 
        cornerPoints[0].Y, 0, 0); 
       } 
      } 
     } 

    } 

    private void button3_Click(object sender, RoutedEventArgs e) 
    { 
     adaptImage(); 
    } 

    private double getLenght(int x1, int y1, int x2, int y2) 
    { 
     return Math.Sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)); 
    } 

} 
} 

當它啓動時:第一個按鈕加載背景,第二個畫,然後最後一個使得它適合繪畫

加載背景的一切之後是確定

裝入畫(隨機正方形)

的其中畫不適合proprely在廣場

回答

1

既然你沒有上傳的XAML代碼最終圖像,我添加了測試下面的XAML代碼,它可以與您的代碼段在我身邊工作。

<Canvas> 
    <Image x:Name="image1" ></Image> 
    <Image x:Name="image2" ></Image> 
    <StackPanel Canvas.Top="20"> 
     <Button x:Name="Button1" Click="button1_Click" Content="button1"></Button> 
     <Button x:Name="Button2" Click="button2_Click" Content="button2"></Button> 
     <Button x:Name="Button3" Click="button3_Click" Content="button3"></Button> 
    </StackPanel> 
</Canvas> 

後面的代碼是一樣的。我在build 15036上測試過。對於我使用AForge Core 2.2.5.60302Imaging 2.2.5.60302的aforge。

但我可以重現您的問題Grid面板作爲父容器,並在同一時間cornerPoints廣場不是從0,0點開始。在Grid面板中,子元素根據其行/列分配進行測量和排列。圖像控件可以默認定位在中間。但是方形的cornerPoints是相對於背景圖像左上角的座標,因此可能由來計算margin是錯誤的。 Canvas適合您的場景。因此,請檢查您是否使用父容器作爲將安排圖像控件的Image控件,例如,StackPanelGrid。更多詳情請參考Layout panels

相關問題