ФорумПрограммированиеБольше языков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.

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