С Новым годом! Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.74/19: Рейтинг темы: голосов - 19, средняя оценка - 4.74
 Аватар для Aeliot
177 / 62 / 3
Регистрация: 17.11.2011
Сообщений: 318

Поворот изображения в файле

10.01.2012, 23:20. Показов 3804. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В win7 по правому клику мышкой на файле изображения есть такие пункты:
- Повернуть по часовой стрелке
- Повернуть против часовой стрелки
Что собственно они и выполняют.

Как сделать то же самое из кода.
Желательно из VB/VBA.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.01.2012, 23:20
Ответы с готовыми решениями:

Поворот bmp изображения на 90 градусов winapi
8) Написать программу, которая читает с диска *.bmp файл и выводит его в окно приложения. При помощи потока организовать поворот...

C++ Win32 Console Загрузка и поворот изображения с расширением *bmp
Всем добрый день! Возник такой вопрос: Необходимо написать программу, которая читает с диска *.bmp файл и выводит его в окно...

Поворот изображения в bmp файле
Повернуть изображение в bmp файле (24 бита) на заданный угол и сохранить в новом файле. Не допускается использования процедур и функций...

14
Эксперт по электронике
6530 / 3159 / 333
Регистрация: 28.10.2011
Сообщений: 12,404
Записей в блоге: 7
11.01.2012, 12:24
Цитата Сообщение от Aeliot Посмотреть сообщение
Как сделать то же самое из кода.
Желательно из VB/VBA.
Где-то у меня был пример поворота изображения на произвольный угол, на PureBasic.
Если интересует, могу попробовать его найти и выложу здесь.
0
 Аватар для Aeliot
177 / 62 / 3
Регистрация: 17.11.2011
Сообщений: 318
11.01.2012, 23:25  [ТС]
Цитата Сообщение от locm Посмотреть сообщение
Где-то у меня был пример поворота изображения на произвольный угол, на PureBasic.
Если интересует, могу попробовать его найти и выложу здесь.
Оч. хотелось бы.
Только нужно повернуть именно в самом файле, чтоб потом скормить его другому скрипту.
0
Эксперт по электронике
6530 / 3159 / 333
Регистрация: 28.10.2011
Сообщений: 12,404
Записей в блоге: 7
12.01.2012, 01:21
Нашел таки пример.
PureBasic
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
60
61
62
63
64
65
66
67
68
69
70
Structure GdiplusStartupInput 
  GdiPlusVersion.l 
  *DebugEventCallback.Debug_Event
  SuppressBackgroundThread.l 
  SuppressExternalCodecs.l 
EndStructure
 
Prototype GdipRotateWorldTransform(*surface, angle.f, state)
Prototype GdipTranslateWorldTransform(*surface, wmidf.f, hmidf.f, state)
 
Procedure InitGDIPlus()
  If OpenLibrary(0, "gdiplus.dll")
    input.GdiplusStartupInput
    input\GdiPlusVersion = 1
    CallFunction(0, "GdiplusStartup", @*token, @input, #Null)
    
    Global GdipRotateWorldTransform.GdipRotateWorldTransform = GetFunction(0,"GdipRotateWorldTransform")
    Global GdipTranslateWorldTransform.GdipTranslateWorldTransform = GetFunction(0,"GdipTranslateWorldTransform")
    
  EndIf
  ProcedureReturn *token
EndProcedure
 
Procedure StringToBStr (string$)
  Protected *mem = AllocateMemory(StringByteLength(String$, #PB_Unicode)+2) 
  Protected bstr_string.l 
  PokeS(*mem, String$, -1, #PB_Unicode) 
  bstr_string = SysAllocString_(*mem)
  FreeMemory(*mem)
  ProcedureReturn bstr_string 
EndProcedure
 
Procedure RotateImage(*image, bkgimage, angle.f)
  width=ImageWidth(bkgimage)
  height=ImageHeight(bkgimage)
  wmidf.f = width/2
  hmidf.f = height/2
  wmid.l = height/2
  hmid.l = height/2  
  hdc=StartDrawing(ImageOutput(bkgimage))
  If hdc
    DrawingMode(#PB_2DDrawing_AlphaChannel)
    Box(0,0,width,height,RGBA(0,0,0,0))
    DrawingMode(#PB_2DDrawing_Default)
    CallFunction(0, "GdipCreateFromHDC", hdc, @*surface)
    GdipRotateWorldTransform(*surface, angle, 1)
    GdipTranslateWorldTransform(*surface, wmidf, hmidf, 1)
    CallFunction(0, "GdipDrawImageRectI", *surface, *image, wmid, hmid, -width, -height)
    CallFunction(0, "GdipResetWorldTransform", *surface)
    StopDrawing()
    CallFunction(0, "GdipDeleteGraphics", *surface)
  EndIf
EndProcedure
 
UsePNGImageDecoder() ; Плагин для открытия PNG рисунков.
UsePNGImageEncoder() ; Плагин для сохранения PNG рисунков.
 
Image.s = "Image.png" ; Путь к файлу рисунка.
angle.f = 90 ; На сколько градусов надо повернуть.
 
*token = InitGDIPlus()
 
CallFunction(0, "GdipCreateBitmapFromFile", StringToBStr(Image), @*wheeldisc)
 
If LoadImage(0,Image) ; Загрузка рисунка
    RotateImage(*wheeldisc, 0, angle)
    SaveImage(0, "Rotate_"+Image, #PB_ImagePlugin_PNG)
  Else
    MessageRequester("", "Ошибка загрузки рисунка "+Chr(34)+Image+Chr(34), #MB_OK|#MB_ICONERROR)
EndIf
В стоковую переменную Image, нужно записать имя файла, а в переменную angle, угол поворота в градусах.
Вложения
Тип файла: rar RotateImage.rar (106.6 Кб, 69 просмотров)
1
 Аватар для Aeliot
177 / 62 / 3
Регистрация: 17.11.2011
Сообщений: 318
15.01.2012, 18:53  [ТС]
Да...
Как-то оно (исполнение) очень отличается от VBA.
Думал PureBasic будет больше похож на "знакомые букавки".
Буду думать как подпилить под нужды.
0
 Аватар для r@di0
103 / 92 / 20
Регистрация: 24.01.2009
Сообщений: 519
17.01.2012, 15:59
Если с изображением работать в формате bmp, то задача сводится к повороту матрицы
0
 Аватар для Aeliot
177 / 62 / 3
Регистрация: 17.11.2011
Сообщений: 318
17.01.2012, 22:32  [ТС]
Цитата Сообщение от r@di0 Посмотреть сообщение
Если с изображением работать в формате bmp, то задача сводится к повороту матрицы
Мне нужно работать с .tif
За функции расчета поворота матрицы спасибо, хот они и на незнакомом мне языке.
Но весь фокус в том, что для того чтоб ими воспользоваться мне нужно будет их в начале загрузить а потом выгрузить каким-то образом. При том, что стандартные средства vba не знают такого формата.
Да и если б я хотел реализовать это на vba, то писал бы в соответствующий форум.

Меня же заинтересовала другая вещь.
В win7 при клике по файлу есть пара пунктов (см. топовый пост), которые всё выполняют средствами самой системы и нет необходимости париться про загрузку/выгрузку файлов в/из памяти и распределение ресурсов.

На сколько я понимаю, есть некая dll-ка в системе, которая всё выполняет. Проводник лишь передаёт в неё ссылку на обрабатываемый файл и направление поворота.

Так вопрос состоит в том что это за файл или набор файлов, которые отвечают за реализацию сего вопроса и как к ним правильно обратиться?
0
 Аватар для r@di0
103 / 92 / 20
Регистрация: 24.01.2009
Сообщений: 519
17.01.2012, 22:49
Вам обязательно использовать средства ОС в явном виде?
Если нет могу накидать Вам небольшую программку для поворота.
0
 Аватар для Aeliot
177 / 62 / 3
Регистрация: 17.11.2011
Сообщений: 318
17.01.2012, 22:58  [ТС]
Цитата Сообщение от r@di0 Посмотреть сообщение
Вам обязательно использовать средства ОС в явном виде?
Если нет могу накидать Вам небольшую программку для поворота.
Если в VBA (vb6) либо я смогу к ней обратиться из vba, то давай.

Кстати, возможно система поворачивает изображения силами Средство просмотра фотографий Windows
0
 Аватар для r@di0
103 / 92 / 20
Регистрация: 24.01.2009
Сообщений: 519
17.01.2012, 23:02
Пишу на Delphi.
Но если Вы опишите какие механизмы использует VB для связи с другими программами,
то готов помочь.
0
375 / 322 / 32
Регистрация: 24.02.2011
Сообщений: 1,512
Записей в блоге: 1
18.01.2012, 17:21
Цитата Сообщение от Aeliot Посмотреть сообщение
Кстати, возможно система поворачивает изображения силами Средство просмотра фотографий Windows
А это Средство просмотра фотографий какими силами поворачивает? О_о
Цитата Сообщение от Aeliot Посмотреть сообщение
В win7 при клике по файлу есть пара пунктов (см. топовый пост), которые всё выполняют средствами самой системы и нет необходимости париться про загрузку/выгрузку файлов в/из памяти и распределение ресурсов.
На сколько я понимаю, есть некая dll-ка в системе, которая всё выполняет. Проводник лишь передаёт в неё ссылку на обрабатываемый файл и направление поворота.
Верно, есть. Gdiplus.dll, Gdi32.dll. Только в память все-равно загружать изображение нужно.
Цитата Сообщение от Aeliot Посмотреть сообщение
Мне нужно работать с .tif
И еще gif, jpeg, png (bmp, родимый, тоже) и ваша задача - все это легко реализуется при помощи GDI+. Там кода будет на 50 строк.
0
 Аватар для Aeliot
177 / 62 / 3
Регистрация: 17.11.2011
Сообщений: 318
19.01.2012, 00:11  [ТС]
Цитата Сообщение от bigredcat Посмотреть сообщение
А это Средство просмотра фотографий какими силами поворачивает? О_о
Без понятия. Я всего лишь предположил.
Цитата Сообщение от bigredcat Посмотреть сообщение
все это легко реализуется при помощи GDI+. Там кода будет на 50 строк.
А пример можно?

Добавлено через 44 минуты
Цитата Сообщение от bigredcat Посмотреть сообщение
Gdiplus.dll, Gdi32.dll
Который выбрать?

по первому
C:\Windows\winsxs\amd64_microsoft.window s.gdiplus_6595b64144ccf1df_1.0.7601.1751 4_none_3bd2e487d8e769d3\GdiPlus.dll
C:\Windows\winsxs\amd64_microsoft.window s.gdiplus_6595b64144ccf1df_1.1.7601.1751 4_none_2b24536c71ed437a\GdiPlus.dll
C:\Windows\winsxs\x86_microsoft.windows. gdiplus_6595b64144ccf1df_1.0.7601.17514_ none_83801b5eed6392d9\GdiPlus.dll
C:\Windows\winsxs\x86_microsoft.windows. gdiplus_6595b64144ccf1df_1.1.7601.17514_ none_72d18a4386696c80\GdiPlus.dll
по второму
C:\Windows\System32\gdi32.dll
C:\Windows\SysWOW64\gdi32.dll
C:\Windows\winsxs\amd64_microsoft-windows-gdi32_31bf3856ad364e35_6.1.7601.17514_no ne_b7a4af6b5ff115ac\gdi32.dll
C:\Windows\winsxs\wow64_microsoft-windows-gdi32_31bf3856ad364e35_6.1.7601.17514_no ne_c1f959bd9451d7a7\gdi32.dll

Какие в них функции по моей теме?
С какими параметрами их вызывать?
0
375 / 322 / 32
Регистрация: 24.02.2011
Сообщений: 1,512
Записей в блоге: 1
19.01.2012, 04:50
Цитата Сообщение от Aeliot Посмотреть сообщение
Который выбрать?
Ну, очевидно, что GDI+ будет удобнее
Цитата Сообщение от Aeliot Посмотреть сообщение
А пример можно?
У меня есть только на C++ (с классами, а не плоской моделью), переписывать на VB6 нет желания.
Цитата Сообщение от Aeliot Посмотреть сообщение
Какие в них функции по моей теме?
С какими параметрами их вызывать?
См. Image Functions

Список требуемых функций (может что-то и забыл):
GdiplusStartup
GpStatus WINGDIPAPI GdipLoadImageFromFile(GDIPCONST WCHAR* filename, GpImage **image)
GpStatus WINGDIPAPI GdipImageRotateFlip(GpImage *image, RotateFlipType rfType)
GpStatus WINGDIPAPI GdipGetEncoderParameterListSize(GpImage *image, GDIPCONST CLSID* clsidEncoder, UINT* size)
GpStatus WINGDIPAPI GdipGetEncoderParameterList(GpImage *image, GDIPCONST CLSID* clsidEncoder, UINT size, EncoderParameters* buffer)
GpStatus WINGDIPAPI GdipGetImagePixelFormat(GpImage *image, PixelFormat *format)
GpStatus WINGDIPAPI GdipSaveImageToFile(GpImage *image, GDIPCONST WCHAR* filename, GDIPCONST CLSID* clsidEncoder, GDIPCONST EncoderParameters* encoderParams)

GdiplusShatdown
0
 Аватар для Aeliot
177 / 62 / 3
Регистрация: 17.11.2011
Сообщений: 318
16.04.2012, 09:54  [ТС]
Я так понимаю, то по предложенному варианту нужно:
1) создать объект из файла
2) повернуть его
3) сохранить в файл.

При это, нужно как-то предусмотреть, чтоб не надорвалась система при обработке больших изображений (иногда такие попадаются).

В варианте с "проводником" передаётся только ссылка на обрабатываемый файл (файлы) и направление поворота. Обо всём остальном заботится сама система.

Как реализовать в таком варианте?
0
10 / 10 / 0
Регистрация: 13.04.2011
Сообщений: 104
06.03.2013, 18:04
Столкнулся с подобной проблемой. Решил с помощью компонента для делфи TRotateImage v1.54.

Скачать можно здесь: http://www.delphiarea.com.

Распространяется бесплатно.

Код поворота. На форме Rotateimage1, невидимый. Можно это все реализовать и без формы.
Delphi
1
2
3
4
5
6
7
8
9
10
procedure Trotatepict.FormCreate(Sender: TObject);
begin
If (fileexists('C:\printed.bmp')) then
begin
Rotateimage1.Picture.LoadFromFile('C:\printed.bmp');
RotateImage1.Angle:=Frac(90/ 360.0) * 360.0;
Rotateimage1.RotatedBitmap.SaveToFile('C:\printed.bmp');
end;
Application.Terminate;
end;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.03.2013, 18:04
Помогаю со студенческими работами здесь

Поворот изображения
понимаю, что тема уже заезжана, но все равно ничего путного не нашел. есть usercontrol, на нем рисуются изображения через .drawimage, можно...

Поворот изображения
Здравствуйте! Совсем еще пока ничего не смыслю в WPF, знания поверхностные. Но вот на текущий момент не могу понять следующего: Как...

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

Поворот изображения.
Всем доброго времени суток. Столкнулся с такой проблемой. Есть скрипт сворачивания \ разворачивания div'а: {literal} <script> ...

Поворот изображения...
Ребят, очень нужна помощь!!! Только начал изучать MFC, помогить с алгоритмом, пожалуйста: нарисовать несколько фигур, на диалоговой панели...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Old Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru