FAQ | Поиск | Пользователи | Группы
Московское время -
просмоторщик изображений.
 
Начать новую тему   Ответить на тему
Список форумов Ногинск - Неофициальный Сайт Ногинского Района (hchp.ru) -> Софт
Предыдущая тема :: Следующая тема  
Автор Сообщение
Хомяк
Форумщик
Форумщик


Зарегистрирован: 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

Т.е. материалы у тебя есть Smile

Есть другая проблема, если ты сам реализуешь этот алгоритм, перед его трасформацией тебе необходимо будет сначала загрузить изображение в буффер, а потом его трасформировать...
Так вот тут могут появиться реальные замедления в скорости с чтением пикселей...

грубо, у канвы (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


.................
З.Ы. А нафига тебе вообще просмоторщик изображений(С). ????

Их мало существует????

_________________
Масло масляное!
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
Гость
Гость





СообщениеДобавлено: Пт Янв 13, 2006 5:51 pm
СообщениеЗаголовок сообщения:
Ответить с цитатой

Блин, Стайл, человек в свободное время этим занимается, а ты тут расписал Laughing Laughing Laughing
Вернуться к началу
Style
Админчег


Зарегистрирован: 30.07.2003
Сообщения: 4251
Откуда: все эти тролли?

СообщениеДобавлено: Пн Янв 16, 2006 2:01 am
СообщениеЗаголовок сообщения:
Ответить с цитатой

Хомяк>> ну де ты там?

ЗЫ а ты че в Диасофте работаиш??? и не кому помочь?? Shocked

_________________
Масло масляное!
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
Хомяк
Форумщик
Форумщик


Зарегистрирован: 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

_________________
Масло масляное!
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
Показать сообщения:   
Список форумов Ногинск - Неофициальный Сайт Ногинского Района (hchp.ru) -> Софт Часовой пояс: GMT + 3
Начать новую тему   Ответить на тему
Страница 1 из 1
Перейти:  

 
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


phpBB
Template by Style

Яндекс цитирования  M M M-100