Быстрый способ обработки рисунка попиксельно

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Kostyan
Постоялец
Постоялец
 
Сообщения: 439
Зарегистрирован: 20.09.2002 (Пт) 4:14
Откуда: Россия, Уссурийск

Сообщение Kostyan » 17.01.2004 (Сб) 7:01

Для начала поставь у Picturebox'a св-во ScaleMode = 3

Dim Pic () As Long - Объяви глобально

Этот код заполняет двумерный массив точками рисунка:
Код: Выделить всё
ReDim Pic(Picture1.ScaleWidth, Picture1.ScaleHeight)
For x = 0 To Picture1.ScaleWidth
  For y = 0 To Picture1.ScaleHeight
    Pic(x, y) = Picture1.Point(x, y)
  Next
Next


Этот код переносит рисунок обратно из массива в пикчебокс:
Код: Выделить всё
For x = 0 To Picture1.ScaleWidth
  For y = 0 To Picture1.ScaleHeight
    Picture1.PSet (x, y), Pic(x, y)
  Next
Next

Kostyan
Постоялец
Постоялец
 
Сообщения: 439
Зарегистрирован: 20.09.2002 (Пт) 4:14
Откуда: Россия, Уссурийск

Сообщение Kostyan » 21.01.2004 (Ср) 1:10

Смотря какие преобразования ты собрался делать. В большинстве случаев достаточно создать совместимый контекст в памяти (CreateCompatibleDC), копировать изображение в него, произвести нужные манипуляции и копировать обратно.

xolod
Гуру
Гуру
 
Сообщения: 1162
Зарегистрирован: 15.01.2004 (Чт) 0:42
Откуда: Moscow

Сообщение xolod » 21.01.2004 (Ср) 1:38

Код: Выделить всё
ReDim Pic(Picture1.ScaleWidth, Picture1.ScaleHeight)
For x = 0 To Picture1.ScaleWidth
  For y = 0 To Picture1.ScaleHeight
    Pic(x, y) = Picture1.Point(x, y)
  Next
Next


&

Код: Выделить всё
For x = 0 To Picture1.ScaleWidth
  For y = 0 To Picture1.ScaleHeight
    Picture1.PSet (x, y), Pic(x, y)
  Next
Next


Да, на фотошоп не тянет. Средний рисунок (да хотя бы 1024x768) знаешь сколько будет обрабатываться? Тем более что мы поместили в массив? Цвет точки и все? Что с этим делать можно???

Тебе надо создавать копию контекста в памяти и рисовать на ней, а потом проецировать результат на picturebox.
Примерчик прилагается..
[/code]

Constant ERROR_SUCCESS deprecated. I'm so happy.
Программирование и дизайн – http://www.macrointellect.ru

Kostyan
Постоялец
Постоялец
 
Сообщения: 439
Зарегистрирован: 20.09.2002 (Пт) 4:14
Откуда: Россия, Уссурийск

Сообщение Kostyan » 21.01.2004 (Ср) 3:07

xolod писал(а):Тебе надо создавать копию контекста в памяти и рисовать на ней, а потом проецировать результат на picturebox.


Плагиат :!: Я уже сказал об этом выше...

xolod писал(а):Тем более что мы поместили в массив? Цвет точки и все? Что с этим делать можно???


А что ещё можно сохранить у точки??? Координаты? Они и так сохранены в виде индексов массива. Может я ещё о чем-то забыл? Научите, о мудрейший из мудрейших...

xolod
Гуру
Гуру
 
Сообщения: 1162
Зарегистрирован: 15.01.2004 (Чт) 0:42
Откуда: Moscow

Сообщение xolod » 21.01.2004 (Ср) 16:34

to Kostyan:

Во первых: насчет плагиата :D. Я не видел вашего сообщения - это раз. И дал более полный и развернутый ответ - это два.

Во вторых: любые API для работы с гарфикой не примут твой массив с точками. Кстати, у точки есть не только координаты и цвет (RTFM GDI/GDI+) но и положение (читай слой) в контексте, да в принципе еще можно привести примеров кучу, так что.. :wink:

Constant ERROR_SUCCESS deprecated. I'm so happy.
Программирование и дизайн – http://www.macrointellect.ru

Kostyan
Постоялец
Постоялец
 
Сообщения: 439
Зарегистрирован: 20.09.2002 (Пт) 4:14
Откуда: Россия, Уссурийск

Сообщение Kostyan » 22.01.2004 (Чт) 1:26

xolod писал(а):любые API для работы с гарфикой не примут твой массив с точками

Вообще-то мне казалось что тов. Sync собирался собственноручно работать с изображением, не прибегая к помощи API. Например получить из цветного изображения ч/б, или применить какаой-нить фильтр (ты где-нибудь видел API-функцию для создания эффекта витража, или поворот изображения в пространстве...?). Я не отрицаю, что контекст в памяти будет быстрее работать нежели массив. Но первоначальный вопрос стоял именно о массиве.

Даниил Козлов
Начинающий
Начинающий
 
Сообщения: 3
Зарегистрирован: 17.01.2004 (Сб) 20:35

Сообщение Даниил Козлов » 22.01.2004 (Чт) 11:03

Возможно есть смысл считывать пиксели в массив не с экрана, а прямо из файла. Плюсы: 1) реальные значения яркости, а не цвет экрана, 2) быстрее чем picture.point(x, y), 3) в этом случае можно не выводить изображение на экран - сначало его преобразовать а потом уже вывести как картинку( через контекст устройства). Как быстро это сделать действительно замечательный пример на http://old.vbstreets.ru/topic.asp?TOPIC ... hichpage=1. Это мне пришло в ответ на http://bbs.vbstreets.ru/viewtopic.php?t=5187

pr_box
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 18.02.2004 (Ср) 22:22

Встречный вопрос

Сообщение pr_box » 22.02.2004 (Вс) 22:56

Делаю контрол для вывода текста в ограниченном поле.
ActiveX контрол с элементом Picture1. Код такой.

Private Sub UserControl_Resize()
UserControl.Size Image1.Width, Image1.Height
End Sub

Public Sub Print_TXT(OutObjekt As Object, TxtString As String, X As Long, Y As Long, _
MaxWidth As Long, MaxHeight As Long)Dim i As Long
Dim j As Long
Dim Index As Long
Dim ArrayTXT() As Long

Index = 0

'Picture1.ScaleMode = vbPixels
Picture1.Width = MaxWidth
Picture1.Height = MaxHeight
Picture1.Cls
Picture1.Print TxtString

ReDim ArrayTXT(MaxWidth * MaxHeight)

For i = 0 To MaxWidth - 1
For j = 0 To MaxHeight - 1
Index = Index + 1
ArrayTXT(Index) = Picture1.Point(i, j)
Next j
Next i

'Печать из ArrayTXT() в объект OutObjekt методом Pset
'OutObjekt.ScaleMode = vbPixelsIndex = 0

For i = X To MaxWidth + X - 1
For j = Y To MaxHeight + Y - 1
Index = Index + 1
OutObjekt.PSet (i, j), ArrayTXT(Index)
Next j
Next i
OutObjekt.ScaleMode = vbTwips
End Sub

Подскажите, где глючит (вроде что-то с Twips)? не пойму.

И еще, насчет ускорения работы, может тебе что нибудь удалось узнать?


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

    TopList  
cron