2016-06-24 16 views
6

Tôi đã tạo ra BitMapSource từ một danh sách các RGBA pixel:Scaling một hình ảnh và định vị nó ở 0,0 trong WPF

BitmapSource bmp = BitmapSource.Create(imageStrideInPixels, height, 96, 96, PixelFormats.Bgra32, null, imageData, imageStrideInPixels * pixelWidth); 

sau đó tôi tạo ra một hình ảnh từ BitMapSource:

// create image and set image as source 
    Image BmpImg = new Image(); 
    BmpImg.SetValue(Canvas.ZIndexProperty, 0); 
    BmpImg.Width = imageScaleWidth; 
    BmpImg.Height = imageScaleHeight; 
    BmpImg.Source = bmp; 

tôi sau đó thêm Hình ảnh vào Canvas:

   mycanvas.Width = imageScaleWidth; 
       mycanvas.Height = imageScaleHeight; 
       mycanvas.Children.Clear(); 
       mycanvas.Children.Add(BmpImg); 
       Canvas.SetLeft(BmpImg, 0); // to set position (x,y) 
       Canvas.SetTop(BmpImg, 0); 

Vấn đề là nó không được thu nhỏ thành hình ảnhScaleWidth và imageScaleHeight, và nó đang được hiển thị một nửa xuống khung vẽ.

Lưu ý, tôi đã có thể làm điều này trong Java SWT bởi:

imageData = imageData.scaledTo(imageScaleWidth, imageScaleHeight); 
gc.drawImage(imageData, 0, 0); 
+1

Bên cạnh đó 'imageStrideInPixels' là tên lạ cho chiều rộng của bitmap, bạn có chắc rằng các tỷ lệ' imageStrideInPixels/imageScaleWidth' và 'height/imageScaleHeight' bằng nhau không? Nếu không, hình ảnh sẽ không chỉ được thu nhỏ, mà còn kéo dài. Sau đó bạn có thể phải đặt 'BmpImg.Stretch = Stretch.Fill;'. – Clemens

+0

Bạn có thực sự cần canvas không? –

+1

vui cách thẻ _java_ của bạn ngăn tôi nhìn thấy điều này, tôi tự hỏi có bao nhiêu người bạn đang loại trừ nó ... –

Trả lời

0

Bạn có chắc chắn hình ảnh được nửa đường xuống tấm bạt và không phải là vải thân tập trung ở mẹ? Tôi đã thử nghiệm nó và có vẻ như bạn có thể kiểm soát vị trí canvas bằng cách đặt căn chỉnh theo chiều dọc/ngang trên bố cục của canvas. Và nó cũng vảy đúng cách khi sử dụng mã bạn đã cung cấp. Tuy nhiên tôi đã tạo một BitmapSource theo một cách khác. Tôi sử dụng đoạn mã sau:

PngBitmapDecoder decoder = new PngBitmapDecoder(new Uri(@"..."), BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default); 
BitmapSource bmp = decoder.Frames[0]; 
1

Thay vì điều này

  mycanvas.Children.Add(BmpImg); 

Hãy thử điều này

 mycanvas.Background = new VisualBrush(BmpImg); 

này nên làm cho đúng cách.

3

Bạn có thể mở rộng hình ảnh của bạn bằng cách sử dụng ScaleTransform:

// scale the original bitmap source 
var transformedBitmap = new TransformedBitmap(
    bmp, 
    new ScaleTransform(
     imageScaleWidth/(double) bmp.PixelWidth, 
     imageScaleHeight/(double) bmp.PixelHeight)); 

// create image and set image as source 
Image bmpImg = new Image(); 
bmpImg.SetValue(Canvas.ZIndexProperty, 0); 
bmpImg.Source = transformedBitmap; 

mycanvas.Width = imageScaleWidth; 
mycanvas.Height = imageScaleHeight; 
mycanvas.Children.Clear(); 
mycanvas.Children.Add(bmpImg); 

Lưu ý rằng hình ảnh của bạn sẽ được bố trí tại offset 0, 0 theo mặc định.

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