Московское время -
Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Хомяк Форумщик
Зарегистрирован: 12.01.2006 Сообщения: 29 Откуда: Ногинск->Белорусская->Каширская
|
Добавлено: Пт Янв 13, 2006 10:34 am Заголовок сообщения: просмоторщик изображений. |
|
|
пишу свой просмоторщик изображений(jpeg, png и т.д.) - сделано пока не много, так как занимаюсь этим в свободное от работы и учебы время. Возникла такая задача - как реализовать поворот изображения? единственный способ который приходит в голову - через массив пикселов(хотя не знаю точно получиться или нет)....если есть еще какие нибудь способы подскажите!!!
p.s. пишу на DELPHI 7. _________________ да Вы что....? правда что ли!!!! а я то думал!!!! |
|
Вернуться к началу |
|
|
Style Админчег
Зарегистрирован: 30.07.2003 Сообщения: 4251 Откуда: все эти тролли?
|
Добавлено: Пт Янв 13, 2006 5:39 pm Заголовок сообщения: |
|
|
Самый простой способ воспользоваться API функцией
SetWorldTransform
Цитата из MSDN
Цитата: | SetWorldTransform
The SetWorldTransform function sets a two-dimensional linear transformation between world space and page space for the specified device context. This transformation can be used to scale, rotate, shear, or translate graphics output.
BOOL SetWorldTransform(
HDC hdc, // handle to device context
CONST XFORM *lpXform // transformation data
);
Parameters
hdc
[in] Handle to the device context.
lpXform
[in] Pointer to an XFORM structure that contains the transformation data.
Return Values
If the function succeeds, the return value is nonzero.
If the function fails, the return value is zero.
Windows NT/2000/XP: To get extended error information, call GetLastError. |
Windows NT/2000/XP
Единственное что, эта функция не работает под Windows 9X, ME ...
Потому что, для ее работы необходимо установить расширенный графический режим текущему DC (Device Context)
SetGraphicsMode(dc, DM_ADVANCED);
Тут приведен пример использования SetWorldTransform
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/cordspac_0inn.asp
Но это возможно только при использовании библиотеки
Library: Use Gdi32.lib.
Соответсвенно в 9X,ME алгоритм нужно реализовать самому.
Сам алгоритм опять же приведен на MSDN
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/cordspac_57cd.asp
Цитата: |
For any coordinates (x, y) in world space, the transformed coordinates in page space (x', y') can be determined by the following algorithm:
x' = x * eM11 + y * eM21 + eDx,
y' = x * eM12 + y * eM22 + eDy,
where the transformation matrix is represented by the following:
| eM11 eM12 0 |
| eM21 eM22 0 |
| eDx eDy 1 |
This function uses logical units. |
eM11 eM12 и т.д это элементы структуры XFORM (в Delphi TXFORM)
вот тут подробнее про эту структуру...
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/cordspac_4tma.asp
Т.е. материалы у тебя есть
Есть другая проблема, если ты сам реализуешь этот алгоритм, перед его трасформацией тебе необходимо будет сначала загрузить изображение в буффер, а потом его трасформировать...
Так вот тут могут появиться реальные замедления в скорости с чтением пикселей...
грубо, у канвы (TCanvas) есть свойство Pixels[x,y] , который возвращает цвет точки по координате x,y - по этому алгоритму ты должен подставить этот цвет другой канве (результирующей) т.е. Pixels[x', y'];
Но API функция чтении пикселя из DC - GetPixel(Dc,x,y) работает очень медленно и SetPixel соответственно, поэтому тебе нужно еще почитать про функции DIB Bitmap,либо, помоему в Delphi 7 - в TCanvas появилось свойство ScanLine (или что то вроде того) которое основано на этих функциях...
Есть другой способ,
загрузить 24 битное (так проще) изображение в TMemoryStream, разобраться с форматом BMP с его заголовком, палитрой и хранием пикселей... и считывать данные о пикселя оттуда... Можно даже создать и свою структуру
TMemPixel = record
blue,
green,
red,
alpha: byte;
end;
и свой тип
TMemBitmap = array of TMemPixel;
PMemBitmap = ^TMemBitmap;
а далее просто присвоить экземляру mybmp: PMemBitmap адрес, с которого начинаются данные в TMemoryStream
mybmp := pointer( integer(stream.Memory) + k);
где k - отступ в bmp файле от 0 до начала данных самого изображения
А потом работать с этой структурой
примерно таким образом.
mybmp[y*Height+x].Red
.................
З.Ы. А нафига тебе вообще просмоторщик изображений(С). ????
Их мало существует???? _________________ Масло масляное! |
|
Вернуться к началу |
|
|
Гость Гость
|
Добавлено: Пт Янв 13, 2006 5:51 pm Заголовок сообщения: |
|
|
Блин, Стайл, человек в свободное время этим занимается, а ты тут расписал |
|
Вернуться к началу |
|
|
Style Админчег
Зарегистрирован: 30.07.2003 Сообщения: 4251 Откуда: все эти тролли?
|
Добавлено: Пн Янв 16, 2006 2:01 am Заголовок сообщения: |
|
|
Хомяк>> ну де ты там?
ЗЫ а ты че в Диасофте работаиш??? и не кому помочь?? _________________ Масло масляное! |
|
Вернуться к началу |
|
|
Хомяк Форумщик
Зарегистрирован: 12.01.2006 Сообщения: 29 Откуда: Ногинск->Белорусская->Каширская
|
Добавлено: Ср Янв 18, 2006 11:07 am Заголовок сообщения: |
|
|
Спасибо Style за твои советы!!! правда я еще не пробывал!!!! а работаю - да в Диасофте! Слушай, если есть кинь ссылочку где можно взять учебник по API(только конкретно для применения в DELPHI и чтобы примеры были) - а то с API вообще туговато пока......спасибки заранее!!! _________________ да Вы что....? правда что ли!!!! а я то думал!!!! |
|
Вернуться к началу |
|
|
Style Админчег
Зарегистрирован: 30.07.2003 Сообщения: 4251 Откуда: все эти тролли?
|
Добавлено: Ср Янв 18, 2006 12:11 pm Заголовок сообщения: |
|
|
Поищи в инете там полно всего...
Delphi WinApi Faq
Справочник WinApi _________________ Масло масляное! |
|
Вернуться к началу |
|
|
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|
|