Witam.
Mam taki problem.
W aplikacji tworzonej pod WPF w C# chciałbym stworzyć obrazek bezpośrednio z kodu (rysując na nim jakieś linie) i zapisać go bezpośrednio do pliku na dysk.
Szukałem na sieci ale rozwiązania, które znalazłem zawsze wyświetlają stworzony obrazek w kontrolce wyświetlanej w oknie a ja nie chce tego nigdzie wyświetlać.
Korzystałem z dwóch rozwiązań:
https://learn.microsoft.com/en-us/dotnet/desktop/wpf/graphics-multimedia/how-to-use-a-drawing-as-an-image-source?view=netframeworkdesktop-4.8
oraz:
https://www.c-sharpcorner.com/UploadFile/mahakgupta/how-to-use-a-drawing-as-an-image-source-in-wpf/
W obydwu przypadkach zakładają mi się na dysku puste obrazki.
Tak jakby DrawImage nie wypełniał obrazka.
Czy ktoś mógłby mi pomóc w rozwiązaniu tego problemu?
Kod, którego używam:
private string CreateSignatureImage(int signatureId)
{
try
{
Koncept.SSD.DAL.DAL.SSDSignature sign = DAL.SSD.Methods.GetSignature(signatureId);
if (sign == null || sign.WindowHeight == null || sign.WindowWidth == null)
return String.Empty;
string result = GetFilePath(string.Format("signature{0}", signatureId));
System.Windows.Controls.Image anImage = new System.Windows.Controls.Image();
anImage.Height = sign.WindowHeight.Value;
anImage.Width = sign.WindowWidth.Value;
anImage.HorizontalAlignment = System.Windows.HorizontalAlignment.Left;
using (var bmp = new System.Drawing.Bitmap((int)sign.WindowWidth.Value, (int)sign.WindowHeight.Value))
using (var gfx = System.Drawing.Graphics.FromImage(bmp))
using (var pen = new System.Drawing.Pen(System.Drawing.Color.White))
{
// draw one thousand random white lines on a dark blue background
gfx.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
gfx.Clear(System.Drawing.Color.Navy);
var pt1 = new System.Drawing.Point(0, 0);
var pt2 = new System.Drawing.Point((int)sign.WindowWidth.Value, (int)sign.WindowHeight.Value);
gfx.DrawLine(pen, pt1, pt2);
anImage.Source = BmpImageFromBmp(bmp);
}
//zapisujemy do pliku
var encoder = new PngBitmapEncoder();
SaveUsingEncoder(anImage, result, encoder);
return result;
}
catch(Exception exp)
{
}
return string.Empty;
}
private BitmapImage BmpImageFromBmp(System.Drawing.Bitmap bmp)
{
using (var memory = new System.IO.MemoryStream())
{
bmp.Save(memory, System.Drawing.Imaging.ImageFormat.Png);
memory.Position = 0;
var bitmapImage = new BitmapImage();
bitmapImage.BeginInit();
bitmapImage.StreamSource = memory;
bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
bitmapImage.EndInit();
bitmapImage.Freeze();
return bitmapImage;
}
}
private void SaveUsingEncoder(FrameworkElement visual, string fileName, BitmapEncoder encoder)
{
RenderTargetBitmap bitmap = new RenderTargetBitmap((int)visual.Width, (int)visual.Height, 96, 96, PixelFormats.Pbgra32);
bitmap.Render(visual);
BitmapFrame frame = BitmapFrame.Create(bitmap);
encoder.Frames.Add(frame);
using (var stream = File.Create(fileName))
{
encoder.Save(stream);
}
}