2011-10-10 39 views
6

Tôi đang hiển thị Hình ảnh WPF (UserControl) thành bitmap nhưng vấn đề là hình ảnh được hiển thị là kích thước của UserControl trước khi được thu nhỏ/chuyển đổi. Vì vậy, hãy nói rằng UserControl được thiết kế ở 200x200 pixel. Khi tôi render đến BMP, tôi đang sử dụng ActualWidth và ActualHeightt của UserControl, báo cáo tương ứng là 200 và 200. Vấn đề là UserControl nằm trong Canvas và có kích thước tự động (được đặt thành tỷ lệ/tô màu với kích thước cửa sổ) đến gần 1200 x 1200 (thay đổi)Cách lấy kích thước được chia tỷ lệ của phần tử Hình ảnh WPF

Tôi đã đọc và tìm kiếm và cho đến nay 't tìm ra cách để xác định kích thước hiệu quả, đó là kích thước điều khiển đang được vẽ trên màn hình.

Tôi đã xem qua câu hỏi này nghe có vẻ hy vọng nhưng Chuyển đổi được trả lại không chứa dữ liệu mở rộng. Vâng, nhưng cả hai đều là 1. Get element position after transform

Bất kỳ đề xuất nào về tìm kiếm tỷ lệ hiển thị sẽ tuyệt vời!

[UPDATE] Như đã đề cập, tôi bao gồm cả mã có liên quan:

public static Bitmap PngBitmap(this Visual visual) 
{ 
    // Get height and width 
    int width = (int)(double)visual.GetValue(
     FrameworkElement.ActualWidthProperty); 
    int height = (int)(double)visual.GetValue(
     FrameworkElement.ActualHeightProperty); 

    // Render 
    RenderTargetBitmap rtb = 
     new RenderTargetBitmap(
      width, 
      height, 
      96, 
      96, 
      PixelFormats.Default); 
    rtb.Render(visual); 

    // Encode 
    PngBitmapEncoder encoder = new PngBitmapEncoder(); 
    encoder.Frames.Add(BitmapFrame.Create(rtb)); 
    System.IO.MemoryStream stream = new System.IO.MemoryStream(); 
    encoder.Save(stream); 

    // Create Bitmap 
    Bitmap bmp = new Bitmap(stream); 
    stream.Close(); 

    return bmp; 
} 

public static BitmapSource BitmapSource(this Visual visual) 
{ 
    Bitmap bmp = visual.PngBitmap(); 
    IntPtr hBitmap = bmp.GetHbitmap(); 
    BitmapSizeOptions sizeOptions = BitmapSizeOptions.FromEmptyOptions(); 
    return Imaging.CreateBitmapSourceFromHBitmap(
         hBitmap, 
         IntPtr.Zero, 
         Int32Rect.Empty, 
         sizeOptions); 
} 

[Update # 2] Added XAML - Yếu tố Lưới đã được gỡ bỏ bởi vì nó là HUGE và từ của tôi việc đọc XAML Canvas chứa bàn phím UserControl KHÔNG phải là một phần của phần tử Grid.

<UserControl xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:local="clr-namespace:PMD.HECAT.DashboardModule" 
    xmlns:PMD_HECAT_DashboardModule_VirtualKeyboard="clr-namespace:PMD.HECAT.DashboardModule.VirtualKeyboard" 
    xmlns:System_Windows_Controls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Input.Toolkit" 
    xmlns:PMD_HECAT_DashboardModule_Input="clr-namespace:PMD.HECAT.DashboardModule.Input" 
    xmlns:control="clr-namespace:PMD.HECAT.DashboardModule.Controls"  
    x:Class="PMD.HECAT.DashboardModule.CandidateElectrodeView"    
    x:Name="UserControl" 
    mc:Ignorable="d" 
    d:DesignWidth="1024" d:DesignHeight="768" Width="640" Height="360"> 
    <UserControl.Resources> 
     <ResourceDictionary> 
      <ResourceDictionary.MergedDictionaries> 
       <ResourceDictionary Source="../Themes/DashboardStyles.xaml" /> 
       <ResourceDictionary Source="../Themes/ImageButtons.xaml" /> 
       <ResourceDictionary Source="CandidateViewResources.xaml" /> 
      </ResourceDictionary.MergedDictionaries> 
     </ResourceDictionary>   
    </UserControl.Resources> 
    <UserControl.Triggers> 
     <EventTrigger RoutedEvent="PMD_HECAT_DashboardModule_VirtualKeyboard:VirtualKeyboardView.KeyboardClose" SourceName="virtualKeyboardView"> 
      <BeginStoryboard Storyboard="{StaticResource OnKeyboardClose1}"/> 
     </EventTrigger> 
    </UserControl.Triggers> 
    <Canvas Width="100" HorizontalAlignment="Left"> 

     <PMD_HECAT_DashboardModule_VirtualKeyboard:VirtualKeyboardView x:Name="virtualKeyboardView" Height="222" Width="550" RenderTransformOrigin="0.5,0.5" Opacity="0" Active="False"> 
      <PMD_HECAT_DashboardModule_VirtualKeyboard:VirtualKeyboardView.RenderTransform> 
       <TransformGroup> 
        <ScaleTransform/> 
        <SkewTransform/> 
        <RotateTransform/> 
        <TranslateTransform X="40" Y="400"/> 
       </TransformGroup> 
      </PMD_HECAT_DashboardModule_VirtualKeyboard:VirtualKeyboardView.RenderTransform> 
     </PMD_HECAT_DashboardModule_VirtualKeyboard:VirtualKeyboardView> 
     <Rectangle Stroke="White" Opacity="0.7" Fill="White" Height="370" Width="654.851" Canvas.Left="687" Canvas.Top="0" /> 
    </Canvas> 
</UserControl> 
+0

Loại chuyển đổi nào được áp dụng cho điều khiển? LayoutTransform hoặc/và RenderTransform? Bạn có ý nghĩa gì bởi "kích thước tự động"? –

+0

@Erno - Thành thật mà nói, tôi không hoàn toàn chắc chắn. Tôi mới, tôi mới hơn so với WPF và chưa nắm bắt được các công cụ Layout. Có vẻ như UserControl nằm bên trong Canvas được cấu hình để mở rộng theo chiều rộng và chiều cao –

+0

rồi hiển thị cho chúng tôi mã để chúng tôi có thể trợ giúp. –

Trả lời

5

Tôi biết rất nhiều thời gian trôi qua kể từ câu hỏi được hỏi nhưng nó không làm tổn thương để gửi một số thông tin hơn :)

tôi sử dụng mã này để tìm kích thước (quy mô) của hình ảnh với ứng dụng render transform (s).

GeneralTransform t = transformedVisual.TransformToVisual(parentVisual); 

Vector topLeft = (Vector) t.Transform(new Point(0,0)); 
Vector topRight = (Vector) t.Transform(new Point(originalWidthOfTransformedVisual, 0)); 

double renderedWidth = (topRight-topLeft).Length; 
double widthScale = renderedWidth/originalWidthOfTransformedVisual; 
+3

Lưu ý rằng thông thường, người ta chỉ đơn giản có thể tính giới hạn của hình ảnh liên quan đến cha mẹ: 'Rect bounds = t .TransformBounds (Rect mới (new Size (transformationVisual.ActualWidth, transformationVisual.ActualHeight)); 'Tất nhiên, để làm việc này,' transformVisual' cần phải là một 'FrameworkElement', thay vì một' Visual' đơn giản (sau này không có bất kỳ thông tin về chiều nào). –

0

Bạn nói bạn sử dụng chiều rộng và chiều cao của Hình ảnh. Đầu tiên, có hai vấn đề. Hình ảnh, http://msdn.microsoft.com/en-us/library/system.windows.media.visual.aspx không có bất kỳ Thuộc tính nào cho Chiều cao và Chiều rộng.

Bây giờ, giả sử bạn có một FrameworkElement, có thuộc tính Chiều cao và Chiều rộng, bạn có đang sử dụng Thuộc tính Chiều cao và Chiều rộng, hoặc thuộc tính ActualHeight và ActualWidth không? Nếu không, thì đó là những thuộc tính bạn đang tìm kiếm.

Nếu bạn đang sử dụng chúng hoặc bạn không sử dụng FrameworkElement, thì bạn nên đăng một số mã.

+0

Xin lỗi vì sự nhầm lẫn. Nó thực sự là một UserControl và tôi đang sử dụng ActualWidth và ActualHeight (tôi đã cập nhật thông báo ban đầu của mình để làm rõ điều này) –

0

Nếu bạn có thể sử dụng hoạt ảnh để thực hiện Transform thì hoạt ảnh sẽ cung cấp sự kiện Completed. Đó sẽ là một nơi tốt để trích xuất kích thước mới được chuyển đổi.

0
public static Rect GetRelativePlacement(this UIElement element, UIElement relativeTo) 
    { 
     var absolutePos = element.PointToScreen(new Point(0, 0)); 
     var posRelativeTo = relativeTo.PointToScreen(new Point(0, 0)); 

     var topLeft = new Point(absolutePos.X - posRelativeTo.X, absolutePos.Y - posRelativeTo.Y); 
     var bottomRight = element.PointToScreen(new Point(element.RenderSize.Width, element.RenderSize.Height)); 

     var bounds = Rect.Empty; 
     bounds.Union(topLeft); 
     bounds.Union(bottomRight); 

     return bounds; 
    } 
1

Hi tôi đã có một vấn đề tương tự nếu hình ảnh không được hiển thị trước khi để lực lượng này render

 uiElement.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity)); 
     uiElement.Arrange(new Rect(new Point(0, 0), uiElement.DesiredSize)); 
     Size _size = uiElement.DesiredSize; 

làm việc này ít nhất là trong trường hợp của tôi để fore các UIElement để Render nó Kích

Các vấn đề liên quan