Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.85/26: Рейтинг темы: голосов - 26, средняя оценка - 4.85
395 / 314 / 53
Регистрация: 14.08.2014
Сообщений: 1,010
1
.NET 4.x

Поставить цифры на изображение формата .jpg

21.10.2014, 14:14. Показов 5222. Ответов 34
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Друзья, может кто-то из вас специалист в этой области и подскажет куда мне двигаться...
В общем есть папка с изображениями, которые в формате jpg.
Имя каждой фотографии содержит имя в виде цифры:
1.jpg
2.jpg
3.jpg
4.jpg
... и т.д.

Задача.
Взять имя фотографии (только цифру) и разместить эту цифру непосредственно на самой фотографии, скажем в нижнем правом или левом углу.
Параметры наложения:
Небольшой отступ от края по осям x и y (отступы ~ по 20px)
Цвет шрифта: черный (как самый черный негр уголь)
Размер шрифта: 12px
Шрифт: Arial
Стиль шрифта: Bold

Если у кого-то есть подобное решение не под jpg, а скажем png, то тоже сойдет.

Добавлено через 1 час 41 минуту
На данный момент есть это:
VB.NET
1
2
3
4
5
6
7
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim MyText As String = "Текст который накладываем на избражение"
        Dim MyNewFont As New Font("Arial", 12, FontStyle.Bold) 'задаем параметры для шрифта
        Dim MyNewBrush As New SolidBrush(Color.FromArgb(250, 250, 0, 0)) 'создаем кисть с цветом
        MyNewBrush.Color = Color.FromArgb(250, 250, 0, 0) 'выбираем цвет кисти
        PictureBox1.CreateGraphics.DrawString(MyText, MyNewFont, MyNewBrush, 10, 10) '10 и 20 это отступы от края. 10, это отступ слева, 20 это отступ сверху
    End Sub
Работает.
Осталось только понять как это запустить в цикле.
Т.е. грубо говоря, указываем программе папку с фотографиями, папку для сохранения, нажали "Запуск" и она пошла обрабатывать все фотографии в указанной папке.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.10.2014, 14:14
Ответы с готовыми решениями:

вставка картинки формата jpg
подскажите как вывести на компонент image изображение в формате ".jpg", при помощи...

Иконки формата jpg на виджетах
День добрый. программа при запуске в qtcreator отлично показывает в иконках виджетов картинки...

Вставка рисунков формата .jpg в canvas
работаю с простейшей графикой в канвасе, есть ли возможность вставлять туда рисунки формата .jpg? А...

Гиперссылки на рисунки формата jpg, расположенные на сетевом диске
Добрый день! возникла следующая проблема. Создан документ в ms excel *.xls, где присутствуют...

34
395 / 314 / 53
Регистрация: 14.08.2014
Сообщений: 1,010
05.11.2014, 17:58  [ТС] 21
Author24 — интернет-сервис помощи студентам
vova2112, я об этом тоже сперва подумал, но странность в том, что сейчас начал интенсивно тестировать и заметил, что иногда ошибка не вылезает, иногда нет. Теперь вот на антивирус грушу. Может он влезает периодически в процесс и смотрит что там сохраняется? В общем погоняю еще, соберу максимум информации и отпишусь чем дело закончилось.
0
Модератор
Эксперт .NET
4203 / 3287 / 497
Регистрация: 27.01.2014
Сообщений: 6,033
07.11.2014, 13:35 22
Добавлено через 1 час 38 минут
А кто-нибудь из заинтересованных этой темой кодеров не подскажет идейку, как можно, взависимости от размера фотографии, менять размер шрифта, ведь в папке погут быть разного размера картинки, и шрифта, например 20пт будет мало для фото, размеров в 3000×2500... какую формулку можно придумать для пересчета размера шрифта доя каждого обрабатываемого изображения?
Думаю вопрос тут уместен, так как относится к данному содержанию кода
1
395 / 314 / 53
Регистрация: 14.08.2014
Сообщений: 1,010
08.11.2014, 13:20  [ТС] 23
Yury Komar, скорее всего нужно плясать от ширины и высоты картинки.
Примерно так.
Узнаем высоту и ширину картинки:
VB.NET
1
2
Dim visotaKartinki As Integer = bm.Height.ToString
Dim shirinaKartinki As Integer = bm.Weight.ToString
Далее нужна какая-то формула, что-то типа:
VB.NET
1
Dim fontSize as String = visotaKartinki * shirinaKartinki / 10
Хотя, может это какой-то адский говнокод и это делается через какие-то свойства, не знаю, нужно читать мерзкий MSDN, но поскольку меня от него трясет, то когда я не нахожу ответа на свой вопрос я предпочитаю говнокод
0
Модератор
Эксперт .NET
4203 / 3287 / 497
Регистрация: 27.01.2014
Сообщений: 6,033
08.11.2014, 19:12 24
Дядя Корней, насчет ШхВ это само собой так как ничего другого и не получится изъять для этих целей... а вот формулку - надо покумекать. Я не думаю что в говнокоде есть ответ на вопрос. А если и есть в случайном примере на совсем другую тему.
спс. :
0
Почетный модератор
21400 / 9134 / 1083
Регистрация: 11.04.2010
Сообщений: 11,014
08.11.2014, 19:29 25
Цитата Сообщение от Дядя Корней Посмотреть сообщение
VB.NET
1
Dim visotaKartinki As Integer = bm.Height.ToString
Дядя Корней, позвольте дать совет:
Если переменная Integer, то оное же свойство не стоит приводить к строке (.ToString)

Лучше уже сейчас оградить себя от подобного. В других языках, даже C#, такое и даже отдаленно похожее не прокатит, мало ли, вдруг на шарп перейдете
1
Модератор
Эксперт .NET
4203 / 3287 / 497
Регистрация: 27.01.2014
Сообщений: 6,033
08.11.2014, 22:29 26
Дядя Корней, Придумал я формулу = (Ш+В)\40.
цыферку "40" меняйте как угодно, чем она меньше, тем шрифт будет крупнее... думаю 35-40 для будет хорошо!
Всем удачи )
0
395 / 314 / 53
Регистрация: 14.08.2014
Сообщений: 1,010
09.11.2014, 14:25  [ТС] 27
Yury Komar, площадь не узнается сложением. В данном случае необходимо именно умножение, затем деление.
Смотрите, допустим у нас прямоугольник Высотой 10px и шириной 5px
В случае с умножением получается:
VB.NET
1
Dim fontSize as String = visotaKartinki * shirinaKartinki / 10
10*5 / 10 = 5
размер шрифта будет равен 5-ти.

Берем вашу формулу:
(Ш+В)\40
10+5 / 40 = 0,375
размер шрифта равен 0,375

Стоит отметить, что я считаю формулу неправильно, слева направо в том порядке в котором она записана. Но вспоминая школьные года, помню, что сперва необходимо умножать, затем делить, а потом уже вычитание и сложение. Я не в курсе как выполняет код VS, поэтому в случае чего это стоит учесть.

Так же стоит не забывать про арифметические операторы.
\ это целочисленное деление
/ это с плавающей запятой.


Памирыч, спасибо за замечание, буду знать.
0
144 / 132 / 34
Регистрация: 28.02.2014
Сообщений: 159
09.11.2014, 15:15 28
Всётаки размер шрифта худо-бедно, но можно рассчитать, а вот как узнать каким цветом писать - белым на тёмном, или тёмным на светлом, я так и не не понял, хотя такое широко применяется.
0
395 / 314 / 53
Регистрация: 14.08.2014
Сообщений: 1,010
09.11.2014, 15:44  [ТС] 29
vova2112, предположу, что нужно сделать анализ пикселей той области, где будет размещаться текст. К примеру если в этой области преимущественно белые пиксели, то естественно выбираем темный шрифт и наоборот, если темные пиксели, то белый шрифт.
Но это только слова. Область, выбор шрифта и т.д. я еще смог бы решить, а вот как сделать анализ пикселей, вот это уже вопрос.
Но если логически, то пиксели наверное нужно скидывать в массив, далее смотреть их rgb и раскидывать на две группы, темные и светлые, исходя из того, каких пикселей (темных или светлых) получилось больше делать выбор шрифта.

Еще как вариант, это когда пишем кистью, делать анализ тех пикселей, на которых пишем и тоже делать выбор.
Осталось только найти смельчака, который знает как эти слова превратить в vb код
0
4407 / 3531 / 843
Регистрация: 02.02.2013
Сообщений: 3,417
Записей в блоге: 2
10.11.2014, 00:47 30
Предлагаю вариант:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
Private Sub Button3_Click(sender As System.Object, e As System.EventArgs) Handles Button3.Click
    Dim dir As New DirectoryInfo("C:\00") 'папка с картинками
    Dim rez As DirectoryInfo = Directory.CreateDirectory("C:\00\rez") 'папка с обработанными картинками
    Dim fStyle As FontStyle = FontStyle.Bold
    Dim fnt As New Font("Arial", 12, fStyle)
    Dim fnt2 As Font
    Dim pnt As New PointF(20, 20) 'левый верхний угол
    Dim jgpEncoder As ImageCodecInfo = GetEncoder(ImageFormat.Jpeg)
    Dim myEncoder As System.Drawing.Imaging.Encoder = System.Drawing.Imaging.Encoder.Quality
    Dim myEncoderParameters As New EncoderParameters(1)
    Dim myEncoderParameter As New EncoderParameter(myEncoder, 100&)
    myEncoderParameters.Param(0) = myEncoderParameter
    Dim g As Graphics
    Dim str As String = ""
    Dim im As Image
    Dim sz As SizeF
    Dim cl As Color
    Dim br As Brush
    For Each fl As FileInfo In dir.GetFiles("*.jpg")
        str = Path.GetFileNameWithoutExtension(fl.FullName)
        im = Image.FromFile(fl.FullName)
        g = Graphics.FromImage(im)
        sz = g.MeasureString(str, fnt, 100)
        'определяем размер шрифта такой чтобы строка str занимала 15% от ширины картинки
        fnt2 = findFont(0.15, str, fnt, fStyle, im.GetBounds(GraphicsUnit.Pixel).Width, sz.Width)
        'определяем новый цвет как дополнение от фона (примерно)
        cl = findColor(sz, pnt, im)
        br = New SolidBrush(cl)
        g.DrawString(str, fnt2, br, pnt)
        'записываем новую картинку
        im.Save(rez.FullName & "\" & str & ".jpg", jgpEncoder, myEncoderParameters)
    Next
    MsgBox("Ok!")
End Sub
 
''' <param name="prc">перекрытие текста в процентах от ширины картинки</param>
Private Function findFont(ByVal prc As Single, ByVal str As String, ByVal fn As Font, ByVal stl As FontStyle, ByVal w As Single, wt As Single) As Font
    Dim dd, fs As Single
    dd = wt / w
    fs = Int(fn.Size * (prc / dd))
    Return New Font(fn.FontFamily, fs, stl)
End Function
 
Private Function findColor(ByVal sz As SizeF, ByVal p As PointF, ByRef im As Image) As Color
    Dim bm As New Bitmap(im)
    Dim cc1 As Color
    Dim rr, gg, bb, n As Integer
    For i = p.Y To p.Y + sz.Height - 1
        For j = p.X To p.X + sz.Width - 1
            cc1 = bm.GetPixel(j, i)
            rr += cc1.R
            gg += cc1.G
            bb += cc1.B
            n += 1
        Next
    Next
    cc1 = Color.FromArgb(255 - CInt(rr / n), 255 - CInt(gg / n), 255 - CInt(bb / n))
    Return cc1
End Function
2
144 / 132 / 34
Регистрация: 28.02.2014
Сообщений: 159
10.11.2014, 02:00 31
Можно ещё вот так определять цвет текста:
VB.NET
1
2
3
4
5
6
7
8
Dim br As Brush
Dim sourceRectangle As New Rectangle(20, 20, 100, 30)
  If CopyBitmap(im, sourceRectangle).GetPixel(0, 0).GetBrightness < 0.5 Then
    br = Brushes.White
  Else
    br = Brushes.Black
  End If
g.DrawString(str, fnt, br, pnt)
а вот функция которая сжимает выбранную часть рисунка(sourceRectangle) в 1 пиксель, для последующего определения яркости этого пикселя.
VB.NET
1
2
3
4
5
6
7
    Private Function CopyBitmap(source As Bitmap, rect As Rectangle) As Bitmap
        Dim bmp As New Bitmap(1, 1)
        Using g As Graphics = Graphics.FromImage(bmp)
            g.DrawImage(source, 0, 0, rect, GraphicsUnit.Pixel)
        End Using
        Return bmp
    End Function
4
207 / 224 / 87
Регистрация: 21.04.2013
Сообщений: 404
10.11.2014, 15:04 32
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Можно сделать контур для текста:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
Imports System.Drawing.Drawing2D
 
Public Class Form1
 
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.Size = New Size(500, 100)
    End Sub
 
    Private Sub Form1_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
        Dim path As New GraphicsPath
        path.AddString("Test Test Test", _
                       Me.Font.FontFamily, _
                       Me.Font.Style, _
                       48, _
                       Me.ClientRectangle, _
                       New StringFormat With {.Alignment = StringAlignment.Center})
 
        With e.Graphics
            .Clear(Color.White)
            .FillRectangle(New SolidBrush(Color.Black), _
                           New Rectangle(Me.ClientRectangle.Width \ 2, Me.ClientRectangle.Y, _
                                         Me.ClientRectangle.Width \ 2, Me.ClientRectangle.Height))
 
            .SmoothingMode = SmoothingMode.HighQuality
            .InterpolationMode = InterpolationMode.HighQualityBicubic
 
            Dim p As New Pen(Color.FromArgb(Me.ForeColor.ToArgb Xor &HFFFFFF), 2)
            p.Alignment = PenAlignment.Center
            .DrawPath(p, path)
            p.Dispose()
 
            .FillPath(New SolidBrush(Me.ForeColor), path)
        End With
 
        path.Dispose()
    End Sub
End Class
З.Ы. Вариант не годится для значений Me.ForeColor близких к "среднему" (&H7F7F7F),
т.к. &H7F7F7F Xor &HFFFFFF = &H808080. Разница для глаз незаметна.
Миниатюры
Поставить цифры на изображение формата .jpg  
3
Модератор
Эксперт .NET
4203 / 3287 / 497
Регистрация: 27.01.2014
Сообщений: 6,033
11.11.2014, 13:25 33
Дядя Корней, а много у тебя в системе картинок размером 10х5?
3000×2000/10 = 600000... не маловато для шрифта то???
0
395 / 314 / 53
Регистрация: 14.08.2014
Сообщений: 1,010
11.11.2014, 13:34  [ТС] 34
Yury Komar, у меня много. Я работаю с тайловой графикой, гейм-реверсинг, поэтому у меня и 1*1 есть.
Цитата Сообщение от Yury Komar Посмотреть сообщение
3000×2000/10 = 600000... не маловато для шрифта то???
Это от балды же. Что мешает 10 заменить на любое другое число?
0
Модератор
Эксперт .NET
4203 / 3287 / 497
Регистрация: 27.01.2014
Сообщений: 6,033
11.11.2014, 13:54 35
Ну это любое другое тоже ведь надо менять взависимости от размера...
а вообще размер 5 для картинки с шириной 10 - это многовато вроде
0
11.11.2014, 13:54
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.11.2014, 13:54
Помогаю со студенческими работами здесь

Вирус зашифровал файлы формата *.doc, *.jpg, *.xls,
Добрый день! Прошу помощи. Произошло следующее, загрузил файл через торрент и затем загруженный...

Смена формата с tga на jpg всех изображений в папке
Есть очень много изображений в одной папке в формате tga. Он открывается фотошопом. Файлы нужно...

Сделать скриншот экрана и сохранить в файл формата jpg или bmp
Приветствую, товарищи. Необходимо сделать скриншот экрана и сохранить в файл формата jpg или bmp....

загрузить в програму изображения формата jpg и получить доступ к каждому пискселю
Весь вопрос в заголовке темы) надеюсь что подскажеет в какую сторну копать)


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
35
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru