2017-04-30 75 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

相关问题