ФорумПрограммированиеБольше языковC/C++ и C# → вычисление координат при наложении картинок

вычисление координат при наложении картинок

  • russianvodka

    Сообщения: 14 Репутация: N Группа: Кто попало

    Spritz Апрель 1, 2010, 10:15 д.п.

    привет.
    Хочу наложить надпись (представляет собой текст "только для предварительного ознакомления" в прямоугольнике) поверх основной картинки…проблема в том, что основные картинки разных размеров и поэтому нужно применять масштабирование накладываемой надписи на картинку, чтобы эта надпись ровно встала с правой стороны картинки и чтобы полностью виделся весь текст надписи…у меня это пока не получается, текст надписи либо наполовину отображается либо ваще нету либо еще както, а сам контейнер (прямоугольник) для надписи, его расположение я сделал так, чтобы он всегда занимал половину картинки, независимо от размера картинки. теперь надо тока решить что делать с самим текстом надписи, т.к. он не полностью отображается на маленьких или среднего размера картинках, из-за отсутствующего масштабирования текста… с большими картинками проблем меньше с отображением, там в основном надпись всегда полностью отображается.

    теперь поподробнее…

    
     public void ProcessRequest(HttpContext context)
        {
            // Убеждаемся, что аргумент ID, содержащийся в URL, является числом 
            int id = -1;
            bool result = Int32.TryParse(context.Request.QueryString["id"], out id);
            if (!result)
                context.Response.End();
            string connString =
            ConfigurationManager.ConnectionStrings["aspBase"].ConnectionString;
            string cmdText = "SELECT shoot FROM films WHERE id=@id";
     
            // Извлекаем массив байтов
            byte[] img = null;
            SqlConnection conn = new SqlConnection(connString);
            using (conn)
            {
                System.Data.SqlClient.SqlCommand cmd = new SqlCommand(cmdText,
                    conn);
                cmd.Parameters.AddWithValue("@id", id);
                conn.Open();
                img = (byte[])cmd.ExecuteScalar();
                conn.Close();
            }
     
            // Подготавливаем ответ для браузера 
            if (img != null)
            {
                Stream bmpStream = new MemoryStream(img);
                Bitmap bmp = new Bitmap(bmpStream); // моя основная картинка
                AddText(bmp, "Только для предварительного ознакомления"); // вызываем функцию добавления текста ("Только для предварительного ознакомления") на основную картинку (bmp)
     
                context.Response.ContentType = "image/jpeg"; // подсказываем браузеру что у нас за формат
                bmp.Save(context.Response.OutputStream, ImageFormat.Jpeg);
                bmp.Dispose();
                bmpStream.Dispose();
            }
        }
     
    //в этой функции я добавляю ту самую надпись поверх картинки
    
        private void AddText(Bitmap bmp, string Text)
        {
            Graphics g = Graphics.FromImage(bmp);
     
            // Определение выравнивания текста        
            StringFormat strFmt = new StringFormat();
            strFmt.Alignment = StringAlignment.Center;
     
            // Создание кисти для написания текста 
            // (зеленый текст на черном фоне) 
            SolidBrush btmForeColor = new SolidBrush(Color.PaleGreen);
            SolidBrush btmBackColor = new SolidBrush(Color.Black);
     
            // Для вычисления координат записи определяем размеры 
            // текста с учетом гарнитуры и размера шрифта 
            Font btmFont = new Font("Verdana", 11);
            SizeF textSize = new SizeF();
            textSize = g.MeasureString(Text, btmFont);
     
            // Рассчитываем координаты прямоугольника и заполняем его
            float x = ((float)bmp.Width - bmp.Width / 2); // чтобы прямоугольник!!! занимал половину картинки по ширине
            float y = ((float)bmp.Height - (bmp.Height / 15)); // чтобы прямоугольник!!! занимал нижнюю часть картинки по высоте
            
            float w = ((float)x + textSize.Width); // ширина надписи
            float h = ((float)y + textSize.Height);// высота надписи
            
            RectangleF textArea = new RectangleF(x, y, w, h);
            g.FillRectangle(btmBackColor, textArea);
     
            // Рисуем текст и освобождаем ресурсы 
            g.DrawString(Text, btmFont, btmForeColor, textArea);
    
            btmForeColor.Dispose();
            btmBackColor.Dispose();
            btmFont.Dispose();
            g.Dispose();
        }
    


    в итоге я считаю, что нужно масштабировать текст ("только для преварительного ознакомления") находящийся в прямоугольнике…но какой алгоритм вычисления масштаба текста применить, я не знаю.
  • adw0rd

    Сообщения: 22959 Репутация: N Группа: в ухо

    Spritz Апрель 1, 2010, 10:16 д.п., спустя 1 минуту 5 секунд

    russianvodka, не "с#", а "c#" (не "эс шарп", а "цэ шарп")
    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • Frozzeg

    Сообщения: 5641 Репутация: N Группа: Джедаи

    Spritz Апрель 1, 2010, 11:58 д.п., спустя 1 час 42 минуты 2 секунды

    размер текста еще зависит от шрифта

    вычисляешь размер прямоугольника и текста (а чтобы его вычислять, ну не знаю.. возьми две картинки разного размера, и вручную к ним подгони текст, и на основе этих данных (размера двух картинок и оптимальных размеров шрифтов для этих картинок) составляй алгоритм
    You can be anything you want to be. Just turn yourself into anything you think that you could ever be.
  • Trej Gun

    Сообщения: 5305 Репутация: N Группа: в ухо

    Spritz Апрель 1, 2010, 4:36 п.п., спустя 4 часа 37 минут 14 секунд

    adw0rd, до диез
  • adw0rd

    Сообщения: 22959 Репутация: N Группа: в ухо

    Spritz Апрель 1, 2010, 4:44 п.п., спустя 8 минут 12 секунд


    adw0rd, до диез
    это музыкантам скажи
    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • russianvodka

    Сообщения: 14 Репутация: N Группа: Кто попало

    Spritz Апрель 1, 2010, 4:45 п.п., спустя 55 секунд

    to Frozzeg:

    ну это не решение проблемы таким способом. тем более в коде я указал, как я вычислил размеры прямоугольника…

    жду еще советов
  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz Апрель 1, 2010, 6:04 п.п., спустя 1 час 19 минут 8 секунд

    Текст, я так понял, один и тот же без вариантов. Стало быть можно забить на текст, а работать с заранее отрендеренной картинкой на которой текст. Подгонка картинки под нужный размер задача давно известная.
    1. из размеров фото вычисляешь размер прямоугольника, в который надо вписать твой "текст". Например это не более 1/4 высоты и не более ширины фото.
    2. вычисляешь множитель, на который надо умножить размеры картинки-надписи, чтобы она вписалась в размер (1) - через min()
    3. умножаешь размеры на множитель, используешь эти размеры для вычисления координат смещения
    ιιlllιlllι унц-унц
  • Frozzeg

    Сообщения: 5641 Репутация: N Группа: Джедаи

    Spritz Апрель 1, 2010, 9:20 п.п., спустя 3 часа 16 минут 14 секунд

    vbnet2000 ?
    You can be anything you want to be. Just turn yourself into anything you think that you could ever be.
  • russianvodka

    Сообщения: 14 Репутация: N Группа: Кто попало

    Spritz Апрель 2, 2010, 10:54 д.п., спустя 13 часов 33 минуты 37 секунд

    asp.net 2.0
  • Frozzeg

    Сообщения: 5641 Репутация: N Группа: Джедаи

    Spritz Апрель 2, 2010, 1:34 п.п., спустя 2 часа 40 минут 35 секунд

    я угадал
    You can be anything you want to be. Just turn yourself into anything you think that you could ever be.

Пожалуйста, авторизуйтесь, чтобы написать комментарий!