2017-01-12 5 views
2

黒い四角形で配置されたイメージを作成しているので、JpegBitmapEncoderに問題があります。私は修正のための解決策がありません。このコードでWPF - 黒背景jpegとして保存されたキャンバスを取り囲んで

private void SaveImage(Canvas canvas, string fileName) 
    { 
     SaveFileDialog s = new SaveFileDialog(); 
     s.FileName = "Pic"; 
     s.DefaultExt = ".jpg"; 
     s.Filter = "JPG files (.jpg)|*.jpg"; 

     Nullable<bool> result = s.ShowDialog(); 
     if (result == true) 
     { 
      RenderTargetBitmap renderBitmap = new RenderTargetBitmap(6646, 3940, 2000d, 2000d, PixelFormats.Pbgra32); 

      canvas.Measure(new Size((int)canvas.Width, (int)canvas.Height)); 
      canvas.Arrange(new Rect(new Size((int)canvas.Width, (int)canvas.Height))); 

      renderBitmap.Render(canvas); 

      string filename = s.FileName; 
      JpegBitmapEncoder encoder = new JpegBitmapEncoder(); 
      encoder.Frames.Add(BitmapFrame.Create(renderBitmap)); 

      using (FileStream file = File.Create(filename)) 
      { 
       encoder.Save(file); 
      } 
     } 
    } 

私が取得:

enter image description here

が、私はこれが起こらないPngBitmapエンコーダーを使用しています。誰でも光を照らすことができますか? 黒い矩形を削除するにはどうすればよいですか、または画像のサイズを大きくして塗りつぶすことはできますか?

答えて

2

.pngは、透過性をサポートしますが、.jpgは透過性をサポートしません。私はあなたのキャンバスの背景が透明であると思うし、それをどうしたらいいのか分からないので、ピクセルのデフォルト(0,0,0)すなわち黒のままにしておきます。 PNGのデフォルトは(0,0,0,0)です。これは透明な黒です。

またはキャンバスのサイズが画像と同じではありません(キャンバスの幅と高さを使用するのではなく、ハードコードされた幅が&の画像を作成します)。それが大きくなるにつれ、キャンバスが実際にカバーする部分だけがレンダリングされます。

初めての場合、キャンバスBackground = "White"をキャンバスに設定して、透明でないものをすべてレンダリングするようにしてください。 2番目の場合は、イメージの寸法を適切なFill = "White"でRectangleに作成し、キャンバスの前にまずレンダリングしてみてください。このような何か:

Rectangle fillBackground = new Rectangle { 
    Width = 6646, 
    Height = 3940, 
    Fill=Brushes.White 
} 

renderBitmap.Render(fillBackground); 
renderBitmap.Render(canvas); 

いくつかのアドバイス、あなたは本当に、レイアウトのコントロールがその親によって決定されるため、これらはNANすることができ、幅と高さを使用しないでください。実際にはCanvas.ActualWidthCanvas.ActualHeightまたはCanvas.RenderSize.Width/Heightを使用する必要があります。これは実際に画面のサイズを常に反映します。また

は、次の使用することができ、あなたのDPIの選択のために調整し、あなたの出力画像のサイズを計算する:

RenderTargetBitmap renderBitmap = new RenderTargetBitmap(Width * DPI/96, 
                 Height * DPI/96, 
                 DPI, DPI, PixelFormats.Pbgra32); 
+0

これは実際には良いですが、それは問題を解決し、問題は(私は境界線を持っていましたキャンバス(実際にキャンバスは画像のxDのサイズです)の周りに私が忘れているので、私は白で国境を埋めるとき、それは実際にトリックを行います! Tnx alot! – MicroDev

+0

問題はありません。私は一週間以内に画像やスクリーンショットをエクスポートすることに取り組んできましたが、ちょうどこの正確な問題にヒットしました! – Joe

関連する問題