Вращение рисунка

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Tarantul
Бывалый
Бывалый
 
Сообщения: 235
Зарегистрирован: 13.12.2004 (Пн) 16:39
Откуда: IUnknown

Вращение рисунка

Сообщение Tarantul » 06.01.2005 (Чт) 14:58

Допустим, есть растровое изображение размером M x N, известен каждый его пиксель. Как создать новое изображение путем поворачивания даного вокруг центра на определенный угол :?:

deepslam
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 286
Зарегистрирован: 19.08.2002 (Пн) 2:25
Откуда: Russia

Сообщение deepslam » 06.01.2005 (Чт) 15:01

BitBlt с отрицательными параметрами вроде...

Tarantul
Бывалый
Бывалый
 
Сообщения: 235
Зарегистрирован: 13.12.2004 (Пн) 16:39
Откуда: IUnknown

Сообщение Tarantul » 06.01.2005 (Чт) 15:54

Дело в том, что мне нужно поворачивать на разные углы(45 градусов, 30 градусов). :)

deepslam
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 286
Зарегистрирован: 19.08.2002 (Пн) 2:25
Откуда: Russia

Сообщение deepslam » 06.01.2005 (Чт) 15:57

Tarantul писал(а):Дело в том, что мне нужно поворачивать на разные углы(45 градусов, 30 градусов). :)

там вроде как разные значения задаешь просто и всё...я не пробовал просто ), но слышал что так делается

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 06.01.2005 (Чт) 16:26


Tarantul
Бывалый
Бывалый
 
Сообщения: 235
Зарегистрирован: 13.12.2004 (Пн) 16:39
Откуда: IUnknown

Сообщение Tarantul » 06.01.2005 (Чт) 17:38

То что нужно, большое спасибо :) :) :)

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 06.01.2005 (Чт) 18:19

А тут пример от меня: http://mix.web.ur.ru/v7.rar

У Ennor-а юзается PlgBlt, которой нет в Win9x.
У Amed-а юзаются GetPixel/SetPixel, которые тормознее, чем прямая работа с данными картинки.

Утверждаю, что мой пример будет работать быстрее, чем Amed-овский, но проверить прямо сейчас не могу.
Изображение

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 07.01.2005 (Пт) 0:06

Хм. Полагаю, для идеального сочетания "производительность - универсальность" особо жаждущим совместимости с мастдаем следует покопать DirectX - наверняка там есть своя функция для этого дела...

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 07.01.2005 (Пт) 5:04

Есть, но пока никому не удалось заставить её работать... Раз я обещал её покопать, буду копать :)

Но примерчик под названием sprite из раздела Direct X всё-таки есть :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 07.01.2005 (Пт) 5:32

GSerg, не издевайся - хоть название функции скажи, там же черт ногу сломит, в этой куче малой... Мне, может, тоже интересно :)

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 07.01.2005 (Пт) 5:57

В общем, пример найти не могу, закачать тоже не могу. А функция называется BltFx :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 07.01.2005 (Пт) 23:55

Хм. И что же мы видим?

MSDN писал(а):DirectDraw 7.0

DirectDrawSurface7.BltFx


The DirectDrawSurface7.BltFx method performs a bit block transfer with additional blit effect behavior specified in the BltFx parameter.

Код: Выделить всё
object.BltFx( _
    destRect As RECT, _
    ddS As DirectDrawSurface7, _
    srcRect As RECT, _
    flags As CONST_DDBLTFLAGS, _
    BltFx As DDBLTFX) As Long


В общем, проблем сразу несколько: во-первых, это метод устаревшего объекта, соотв-но, надо искать современную замену - хотя бы в DX8. Далее, инициализировать весь DX ради одного плаг-блита... не знаю, меня бы заломало.
А вот в GDI+ кое-что есть Ели быть более точным, то нам подходит Image::RotateFlip - по сути, аналог PlgBlt(). Теперь бы только разобраться, как все это реализовать - примеры там исключительно сишные...

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 08.01.2005 (Сб) 0:26

Ennor, моя обёртка для GDI+ уже поволяет крутить картинки.
Изображение

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2056
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 08.01.2005 (Сб) 0:30

А текст на картинки накладывать можно ? :)

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 08.01.2005 (Сб) 1:25

Можно :-)
Если картинка лежит в b, то
Код: Выделить всё
CreateGraphicsFromImage(b).DrawString CreateFont("Tahoma", FontStyleRegular, 14, UnitPoint), CreateBrush(ARGB(vbRed, 128)), "Hello!", 0, 0

нарисует в её левом верхнем углу полупрозрачную красную строку "Hello!" шрифтом Tahoma 14pt.
Изображение

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2056
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 08.01.2005 (Сб) 12:44

А если

response.binarywrite GDI.CreateImage(PICTURE_PATH).GetThumbnailImage(WIDTH,HEIGHT).SaveToJpegToMemoryVar((80),64)

На поток текст наложить нельзя ? :(

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 08.01.2005 (Сб) 19:34

ALX_2002 писал(а):А если

response.binarywrite GDI.CreateImage(PICTURE_PATH).GetThumbnailImage(WIDTH,HEIGHT).SaveToJpegToMemoryVar((80),64)

На поток текст наложить нельзя ? :(

На поток нельзя. Пиши:
Код: Выделить всё
Dim b
Set b = GDI.CreateImage(PICTURE_PATH).GetThumbnailImage(WIDTH, HEIGHT)
GDI.CreateGraphicsFromImage(b).DrawString GDI.CreateFont("Tahoma", GDI.FontStyleRegular, 14, GDI.UnitPoint), GDI.CreateBrush(GDI.ARGB(255, 128)), "Hello!", 0, 0
Response.BinaryWrite b.SaveToJpegToMemoryVar((80),64)
Изображение

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2056
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 08.01.2005 (Сб) 20:38

2 Tyomitch: У ты какой ! 8) ! Хитрый :) :wink:

Слушай... А в GIF пока ещё не сейвит ? :wink:

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 08.01.2005 (Сб) 20:52

Сейвит... И в PNG, и в BMP - куда захочешь :cool:
Метод SaveToMemoryVar с параметром "image/gif" ("image/png", "image/bmp" соответственно)
Изображение

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 08.01.2005 (Сб) 22:57

tyomitch писал(а):У Amed-а юзаются GetPixel/SetPixel, которые тормознее, чем прямая работа с данными картинки.

Утверждаю, что мой пример будет работать быстрее, чем Amed-овский, но проверить прямо сейчас не могу.


Мой пример, имхо, всё же быстрее. См. там третий тип вращения.

A PlgBlt пока никто не мог заставить работать, это верно. В лучшем случае возвращает ноль ;)

А лучше всего использовать чудо-фантик (:lol:) и не париться, действительно.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 08.01.2005 (Сб) 23:42

Amed писал(а):
tyomitch писал(а):У Amed-а юзаются GetPixel/SetPixel, которые тормознее, чем прямая работа с данными картинки.

Утверждаю, что мой пример будет работать быстрее, чем Amed-овский, но проверить прямо сейчас не могу.

Мой пример, имхо, всё же быстрее. См. там третий тип вращения.

Имха - это хорошо, но неплохо бы всё же и проверить...
Обязательно проверю, как руки дойдут. Из спортивного интереса :-)
Изображение

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2056
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 09.01.2005 (Вс) 0:56

2 Tyomitch:

1) Отец... К сожалению не достучался к тебе в ICQ.

Забыл сказать - у твоей DLL есть маааленький БАГ

Она размер рисунка берёт из файла, а он иногда бывает глючный и не

совпадает с реальными размерами. Чего делать ? :roll:

2) Хотел узнать - а можно сразу файл потоком отдать ?

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 09.01.2005 (Вс) 2:59

ALX_2002 писал(а):Она размер рисунка берёт из файла, а он иногда бывает глючный и не
совпадает с реальными размерами. Чего делать ? :roll:
В смысле, какой размер - в пикселах? Ну, не знаю, какой есть - такой и отдаю :-)
Или размер файла?

ALX_2002 писал(а):2) Хотел узнать - а можно сразу файл потоком отдать ?
Не засовывая в Variant? Вообще - можно, а зачем?
Или что конкретно нужно?
Изображение

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2056
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 09.01.2005 (Вс) 11:50

В общем дело такое :)

Я ж на ASP делал FILE SERVER

Так вот - у меня на основной странице показываются уменьшенные

эскизы рисунков, а при щелчке по ним - открывается страница на

которой показывается сам рисунок.

Мне его нужно отдать потоком, в том виде как он есть. С его

реальными размерами. я пробывал указывать высоту и ширину=0, но

1) из-за ошибочных размеров, указанных в самом файле рисунок отображается сжатым
2) Он выдавался как JPG - а мне нужно выдавать его в том формате, в каком он есть.

вот. :) .

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2056
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 09.01.2005 (Вс) 19:33

Обалдеть....

Я через FSO отдаю рисунок потоком. Часть рисунков срабатывает, а часть нет....

Через твою DLL отдаёт всё, но как JPG !!! :D

В упор не пойму в чём дело..... :shock:

По ходу мне всё таки нужно написать свою DLL бинарного чтения

из файла.... :idea: :(

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 09.01.2005 (Вс) 21:03

ALX_2002, я ведь уже написал, что моя DLL может сохранять в любых форматах, а не только в JPEG.
Изображение

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2056
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 09.01.2005 (Вс) 21:07

А я уже написал, что это просто великолепно и спросил, как отдать файл потоком без его изменения в какой либо формат ? :)

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 09.01.2005 (Вс) 22:02

Никак. Этот же вопрос обсуждается в http://bbs.vbstreets.ru/viewtopic.php?t=12465
У меня библиотека для работы с графикой, а не с файлами :-)
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 11.01.2005 (Вт) 5:29

tyomitch писал(а):
Amed писал(а):
tyomitch писал(а):У Amed-а юзаются GetPixel/SetPixel, которые тормознее, чем прямая работа с данными картинки.

Утверждаю, что мой пример будет работать быстрее, чем Amed-овский, но проверить прямо сейчас не могу.

Мой пример, имхо, всё же быстрее. См. там третий тип вращения.

Имха - это хорошо, но неплохо бы всё же и проверить...
Обязательно проверю, как руки дойдут. Из спортивного интереса :-)

Сейчас, ввиду того, что сдал экзамен, руки дошли.
Действительно, скорости примерно одинаковые (т.е. разница в пределах погрешности).
Но твой метод использует, что фон чёрный (т.е. мне пришлось дописывать его, чтобы он мог работать и с картинками с белым фоном).
Изображение


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

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

Сейчас этот форум просматривают: Yandex-бот и гости: 6

    TopList