Конвертация метафайла в bmp
От: Аноним  
Дата: 01.11.11 14:51
Оценка:
При конвертации метафайл (график) в bmp текст размывается (становится жирным ).
Подскажите в чем причина?


using (MemoryStream ms = new MemoryStream(data))
{
    Metafile metafile1 = new Metafile(ms);

    ImageCodecInfo jgpEncoder = GetEncoder(ImageFormat.Bmp);
    System.Drawing.Imaging.Encoder myEncoder =System.Drawing.Imaging.Encoder.Quality;
    EncoderParameters myEncoderParameters = new EncoderParameters(1);
    EncoderParameter myEncoderParameter = new EncoderParameter(myEncoder, 100L);
    myEncoderParameters.Param[0] = myEncoderParameter;

    Bitmap newBitmap = new Bitmap(width, height);
    
    Graphics myGraphics = Graphics.FromImage(newBitmap);
    Rectangle rcSrc = new Rectangle(0, 0, metafile1.Width, metafile1.Height);
    Rectangle rcDest = new Rectangle(0, 0, width , height );

    myGraphics.SmoothingMode = SmoothingMode.HighQuality;
    myGraphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
    myGraphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
    myGraphics.CompositingQuality = CompositingQuality.HighQuality;


    myGraphics.Clear(Color.Black);
    myGraphics.DrawImage(metafile1, rcDest, rcSrc, GraphicsUnit.Pixel);


    newBitmap.Save(@"D:\temp\Jpgs_100\file_" + id +  ".bmp", jgpEncoder, myEncoderParameters);
}
Re: Конвертация метафайла в bmp
От: Elderos Россия  
Дата: 01.11.11 15:17
Оценка:
Если я правильно думаю, что jgpEncoder — это кодировщик в Jpeg, то вам сюда
Re[2]: Конвертация метафайла в bmp
От: Аноним  
Дата: 01.11.11 15:31
Оценка:
Здравствуйте, Elderos, Вы писали:

E>Если я правильно думаю, что jgpEncoder — это кодировщик в Jpeg, то вам сюда

Не помогло, png тоже самое.
Re[3]: Конвертация метафайла в bmp
От: Elderos Россия  
Дата: 01.11.11 15:44
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Elderos, Вы писали:


E>>Если я правильно думаю, что jgpEncoder — это кодировщик в Jpeg, то вам сюда

А>Не помогло, png тоже самое.

Тогда картинки в студию
Re: Конвертация метафайла в bmp
От: Legion13  
Дата: 01.11.11 17:55
Оценка:
Здравствуйте, Аноним, Вы писали:

А>При конвертации метафайл (график) в bmp текст размывается (становится жирным ).

А>Подскажите в чем причина?

А если интерполяцию отключить?
Re[2]: Конвертация метафайла в bmp
От: Аноним  
Дата: 02.11.11 05:54
Оценка:
Здравствуйте, Legion13, Вы писали:

L>А если интерполяцию отключить?

А как его отключить не подскажите?
Re[3]: Конвертация метафайла в bmp
От: Legion13  
Дата: 02.11.11 06:53
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Legion13, Вы писали:


L>>А если интерполяцию отключить?

А>А как его отключить не подскажите?

Попробуйте закомментарить вот этот код:
myGraphics.SmoothingMode = SmoothingMode.HighQuality;
myGraphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
myGraphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
myGraphics.CompositingQuality = CompositingQuality.HighQuality;
Re[4]: Конвертация метафайла в bmp
От: Аноним  
Дата: 02.11.11 07:21
Оценка:
Здравствуйте, Legion13, Вы писали:

L>Попробуйте закомментарить вот этот код:

L>
L>myGraphics.SmoothingMode = SmoothingMode.HighQuality;
L>myGraphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
L>myGraphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
L>myGraphics.CompositingQuality = CompositingQuality.HighQuality;
L>


Не помогло
Re[4]: Конвертация метафайла в bmp
От: Wise_PingWin  
Дата: 02.11.11 07:25
Оценка:
Здравствуйте, Legion13, Вы писали:

L>Здравствуйте, Аноним, Вы писали:


А>>Здравствуйте, Legion13, Вы писали:


L>>>А если интерполяцию отключить?

А>>А как его отключить не подскажите?

L>Попробуйте закомментарить вот этот код:

L>
L>myGraphics.SmoothingMode = SmoothingMode.HighQuality;
L>myGraphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
L>myGraphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
L>myGraphics.CompositingQuality = CompositingQuality.HighQuality;
L>



Здесь так не прокатит. Информация о том как сглаживать (и вообще, как рисовать) векторное изображение находится в самом metafile'е, настройки myGraphics на качество отрисовки никак не влияют никак не влияют.
Пример:
private static Metafile CreateNewMetafile()
{
    Metafile result;
    using (Bitmap b = new Bitmap(1, 1))
    using (Graphics g = Graphics.FromImage(b))
    using (MemoryStream ms = new MemoryStream())
    {
        IntPtr ipHdc = g.GetHdc();
        result = new Metafile(ms, ipHdc, EmfType.EmfPlusOnly);
        g.ReleaseHdc(ipHdc);
    }
    return result;
}

private static Metafile TestGraphic(bool smoothing)
{
    var result = CreateNewMetafile();
    using (Graphics graphics = Graphics.FromImage(result))
    {
        graphics.SmoothingMode = smoothing ? SmoothingMode.HighQuality : SmoothingMode.None;
        //оси
        using (Pen pen = new Pen(Color.Black, 2))
        {
            graphics.DrawLine(pen, new Point(0, 1000), new Point(0, 0));
            graphics.DrawLine(pen, new Point(0, 1000), new Point(1000, 1000));
        }
        //типо график
        graphics.DrawLine(Pens.Black, new Point(0, 700), new Point(400, 700));
        graphics.DrawArc(Pens.Black, new Rectangle(new Point(300, 500), new Size(200, 200)), 0, 90);
        graphics.DrawArc(Pens.Black, new Rectangle(new Point(500, 500), new Size(200, 200)), 180, 180);
        graphics.DrawLine(Pens.Black, new Point(700, 600), new Point(1000, 1000));
    }
    return result;
}

private static void DrawPng(Metafile meta, int width, int height)
{
    using (Bitmap bmp = new Bitmap(width, height))
    using (Graphics graphics = Graphics.FromImage(bmp))
    {
        Rectangle rcSrc = new Rectangle(0, 0, meta.Width, meta.Height);
        Rectangle rcDest = new Rectangle(0, 0, bmp.Width, bmp.Height);

        graphics.SmoothingMode = SmoothingMode.None;
        graphics.InterpolationMode = InterpolationMode.Low;

        graphics.DrawImage(meta, rcDest, rcSrc, GraphicsUnit.Pixel);
        bmp.Save(@"C:\png.png");
    }
}

[STAThread]
public static void Main(string[] args)
{
    using (var meta = TestGraphic(true))
    {
        meta.Save(@"C:\meta.wmf");
        DrawPng(meta, 10000, 10000);
    }
}
Re[5]: Конвертация метафайла в bmp
От: Wise_PingWin  
Дата: 02.11.11 07:37
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Legion13, Вы писали:


L>>Попробуйте закомментарить вот этот код:

L>>
L>>myGraphics.SmoothingMode = SmoothingMode.HighQuality;
L>>myGraphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
L>>myGraphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
L>>myGraphics.CompositingQuality = CompositingQuality.HighQuality;
L>>


А>Не помогло


Я не до конца понял из вашего сообщения, если вы пишете следующий код, то получаете разные изображения? png — жирный?
using (MemoryStream ms = new MemoryStream(data))
{
    Metafile metafile1 = new Metafile(ms);
    metafile1.Save(@"C:\01.wmf");
    using (Bitmap bmp = new Bitmap(metafile1.Width, metafile1.Height))
    using (Graphics graphics = Graphics.FromImage(bmp))
    {
        Rectangle rect = new Rectangle(Point.Empty, metafile1.Size);
        graphics.DrawImage(metafile1, rect, rect, GraphicsUnit.Pixel);
        bmp.Save(@"C:\02.png");
    }
}
Re[5]: Конвертация метафайла в bmp
От: Аноним  
Дата: 02.11.11 08:58
Оценка:
Здравствуйте, Wise_PingWin
Проблемы с искажением происходят, когда меняешь разрешение:

width и height — примерно 1/3 от meta.Width, meta.Height

Rectangle rcSrc = new Rectangle(0, 0, meta.Width, meta.Height);
Rectangle rcDest = new Rectangle(0, 0, width, height);

graphics.SmoothingMode = SmoothingMode.None;
graphics.InterpolationMode = InterpolationMode.Low;
graphics.DrawImage(meta, rcDest, rcSrc, GraphicsUnit.Pixel);

и все текст уже поплыл.
Может проблема в emf, они экспортируются из Excell и хранятся в БД?
Re[6]: Конвертация метафайла в bmp
От: Wise_PingWin  
Дата: 02.11.11 10:28
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Wise_PingWin

А>Проблемы с искажением происходят, когда меняешь разрешение:

А>width и height — примерно 1/3 от meta.Width, meta.Height


А>
А>Rectangle rcSrc = new Rectangle(0, 0, meta.Width, meta.Height);
А>Rectangle rcDest = new Rectangle(0, 0, width, height);

А>graphics.SmoothingMode = SmoothingMode.None;
А>graphics.InterpolationMode = InterpolationMode.Low;
А>graphics.DrawImage(meta, rcDest, rcSrc, GraphicsUnit.Pixel); 
А>

А>и все текст уже поплыл.
А>Может проблема в emf, они экспортируются из Excell и хранятся в БД?

За качество текста отвечает свойство graphics.TextRenderingHint, но менять его надо при рисовании вектора. Если при экспорте из Excel вам доступны какие-то подобные настройки, то поищите что-то подобное там.

Если нет, то скорее всего используется значение по умолчанию : TextRenderingHint.SystemDefault. Я видел разные начертания текста по умолчанию в разных версиях Windows (в русской всегда убогий шрифт), так что может быть его можно поменять, только я не знаю где . Это не решит проблему с уже экспортированными графиками, но новые будут с читаемым текстом.

Если не выйдет, то придется извращаться. Например, нарисовать векторный образ на растровом такого же размера, а потом уже его нарисовать на уменьшенном. Но это как-то некрасиво совсем. Может еще стоит посмотреть на graphics.ScaleTransform(dx, dy)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.