Этот сайт не наркоманов. Это сайт программистов.

Добро пожаловать на Пыху!

Логин:
Пароль:
 

Нет прописки? Зарегистрируйся!

Новости

Пыха переехала на новый сервер, ура!

Краснодарское время: 26 Май, 2012, 03:27:24

Страниц: [1]
Печать
Автор Тема: вычисление координат при наложении картинок  (Прочитано 1265 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
russianvodka    ↓ 
01 Апрель, 2010, 10:15:42
НЕ ХУЕТА! ХУЕТА!


Карма: 0
Сообщений: 16
Сила слова: 0

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

 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();
    }
 

в итоге я считаю, что нужно масштабировать текст ("только для преварительного ознакомления") находящийся в прямоугольнике...но какой алгоритм вычисления масштаба текста применить, я не знаю.
« Последнее редактирование: 01 Апрель, 2010, 10:15:42 от adw0rd » Записан

%500
adw0rd    ↓ 
01 Апрель, 2010, 10:16:47 , спустя 1 минуту 5 секунд
НЕ ХУЕТА! ХУЕТА!

эдво
Группа: в ухо

Карма: не нужна
Сообщений: 17634
Сила слова: 1.67

russianvodka, не "с#", а "c#" (не "эс шарп", а "цэ шарп")
Записан

Python, Django, Git, Emacs, Nginx, MySQL, SphinxSearch, FreeBSD/Linux
Мой блог * Кинсбург * Либург * Я на GitHub
Frozzeg    ↓ 
01 Апрель, 2010, 11:58:49 , спустя 1 час 42 минуты 2 секунды
НЕ ХУЕТА! ХУЕТА!

Группа: Санитары

Карма: 92
Сообщений: 5501
Сила слова: 1.67

размер текста еще зависит от шрифта
 
вычисляешь размер прямоугольника и текста (а чтобы его вычислять, ну не знаю.. возьми две картинки разного размера, и вручную к ним подгони текст, и на основе этих данных (размера двух картинок и оптимальных размеров шрифтов для этих картинок) составляй алгоритм
Записан
CTAPbIu_MABP    ↓ 
01 Апрель, 2010, 04:36:03 , спустя 4 часа 37 минут 14 секунд
НЕ ХУЕТА! ХУЕТА!

мавр
Группа: в ухо

Карма: не нужна
Сообщений: 5187
Сила слова: 1.81

adw0rd, до диез
Записан

java.lang.OutOfMemoryError
adw0rd    ↓ 
01 Апрель, 2010, 04:44:15 , спустя 8 минут 12 секунд
НЕ ХУЕТА! ХУЕТА!

эдво
Группа: в ухо

Карма: не нужна
Сообщений: 17634
Сила слова: 1.67


adw0rd, до диез
это музыкантам скажи
Записан

Python, Django, Git, Emacs, Nginx, MySQL, SphinxSearch, FreeBSD/Linux
Мой блог * Кинсбург * Либург * Я на GitHub
russianvodka    ↓ 
01 Апрель, 2010, 04:45:10 , спустя 55 секунд
НЕ ХУЕТА! ХУЕТА!


Карма: 0
Сообщений: 16
Сила слова: 0

to Frozzeg:
 
ну это не решение проблемы таким способом. тем более в коде я указал, как я вычислил размеры прямоугольника...
 
жду еще советов
Записан

%500
artoodetoo    ↓ 
01 Апрель, 2010, 06:04:18 , спустя 1 час 19 минут 8 секунд
НЕ ХУЕТА! ХУЕТА!

с особым цинизмом
Группа: в ухо

Карма: 124
Сообщений: 3805
Сила слова: 3.26

Текст, я так понял, один и тот же без вариантов. Стало быть можно забить на текст, а работать с заранее отрендеренной картинкой на которой текст. Подгонка картинки под нужный размер задача давно известная.
1. из размеров фото вычисляешь размер прямоугольника, в который надо вписать твой "текст". Например это не более 1/4 высоты и не более ширины фото.
2. вычисляешь множитель, на который надо умножить размеры картинки-надписи, чтобы она вписалась в размер (1) - через min()
3. умножаешь размеры на множитель, используешь эти размеры для вычисления координат смещения
Записан
Frozzeg    ↓ 
01 Апрель, 2010, 09:20:32 , спустя 3 часа 16 минут 14 секунд
НЕ ХУЕТА! ХУЕТА!

Группа: Санитары

Карма: 92
Сообщений: 5501
Сила слова: 1.67

vbnet2000 ?
Записан
russianvodka    ↓ 
02 Апрель, 2010, 10:54:09 , спустя 13 часов 33 минуты 37 секунд
НЕ ХУЕТА! ХУЕТА!


Карма: 0
Сообщений: 16
Сила слова: 0

asp.net 2.0
Записан

%500
Frozzeg    ↓ 
02 Апрель, 2010, 01:34:44 , спустя 2 часа 40 минут 35 секунд
НЕ ХУЕТА! ХУЕТА!

Группа: Санитары

Карма: 92
Сообщений: 5501
Сила слова: 1.67

я угадал
Записан
Страниц: [1]
Печать
 

Перейти в: