Форум программистов, компьютерный форум, киберфорум
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.74/19: Рейтинг темы: голосов - 19, средняя оценка - 4.74
0 / 0 / 0
Регистрация: 01.01.2010
Сообщений: 13

сохранить изображение в файл

01.01.2010, 21:00. Показов 3977. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
здравствуйте!

у меня вопрос:как в графическом режиме сохранить изображение(например квадратик) в файл???
создание и закрытие файла есть, а с записью не получается(((
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.01.2010, 21:00
Ответы с готовыми решениями:

Сохранить изображение из PictureBox в файл
Ребят подскажите как сохранить изображение из picturebox файл jpg.

Сохранить изображение из picturebox в файл
Здравствуйте, помогите пожалуйста решить проблему. Я хочу сделать программу следующего содержания: Есть форма, на ней...

Сохранить изображение на форме в файл
Собственно вопрос, я ещё новичок в Delphi но некоторые аспекты программирования знаю, появилось желание создать следующую программу: на...

18
 Аватар для mikityak
617 / 22 / 0
Регистрация: 30.09.2007
Сообщений: 357
02.01.2010, 10:19
Исходники: Графика
0
0 / 0 / 0
Регистрация: 01.01.2010
Сообщений: 13
02.01.2010, 14:35  [ТС]
в исходниках ничего не нашел.
задание полностью звучит так:

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

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

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        mov ax,0a000h
    mov ds,ax
    mov si,50
    lea di,cs:bufin
    push cs
    pop es
 
    mov cx,50
    rep movsb
    
    mov ah,40h
    mov bx,cs:handle
    mov cx,50
    mov dx,offset cs:bufin
    int 21h
в приведенном коде сохраняется в файл только 50 байт первой строки, а как сохранить изображение полностью???
0
1779 / 757 / 153
Регистрация: 03.06.2009
Сообщений: 5,940
02.01.2010, 20:19
из обработчика нельзя просто так вызывать другие прерывания
Вот порядок:
;Особенности резидентных программ
;TSR-программы имеют некоторые особенности, отличающие их от "нормальных" программ.
;Им не разрешается использовать DOS-прерывания, когда вздумается. Это связано с тем, что DOS проектировалась как однозадачная операционная система, поэтому модули DOS не обладают свойством реентерабельности (повторной входимости). Что это означает на практике?
;Допустим, Ваша программа записывает длинный файл на диск. Во время записи вы (возможно, случайно) нажали клавишу, активизирующую TSR-программу записи содержимого экрана в файл.
;Теперь доступа к диску требуют две программы - прикладная, записывающая длинный файл, и Ваша TSR-программа. Запись файла из прикладной программы приостановится, далее произойдет запись копии экрана в файл, после чего возобновится запись файла из прикладной программы. Все было бы хорошо, если бы прикладная программа и TSR-программа не использовали одни и те же внутренние области данных DOS для работы с диском. При запуске TSR-программа безвозвратно испортит текущее состояние служебных областей данных, которые прикладная программа использовала при записи на диск.
;И таких примеров можно привести много. BIOS также далеко не весь реентерабельный. TSR-программа может смело использовать разве лишь прерывание 16h для работы с клавиатурой, которое реентерабельно. Для вывода на экран лучше всего использовать непосредственную запись символов в видеопамять дисплейного адаптера.
;Не стоит пользоваться многими функциями библиотеки Quick C, так как они могут вызывать прерывания DOS. Например, функция malloc() вызывает прерывание DOS для определения размера свободной памяти в системе.
;Могут возникнуть трудности с использованием арифметических действий с числами в формате плавающей запятой, так как функция _dos_keep() при завершении программы восстанавливает прерывания, использовавшиеся для эмуляции арифметики с плавающей запятой и для работы с арифметическим сопроцессором.
;Некоторые из перечисленных проблем (те, что связаны с использованием прерываний DOS) можно решить с помощью недокументированного прерывания INT 28h.
;Это прерывание вызывается DOS при ожидании ввода с клавиатуры. В этот момент вы можете использовать любое прерывание DOS, кроме функций от 00h до 0Сh прерывания INT 21h. Утилита спулинга печати PRINT.COM использует это прерывание.
;Можно рекомендовать следующий способ использования прерывания 28h. Обработчик прерывания 9 отслеживает нажатие клавиши, которая должна активизировать TSR-программу. Обнаружив эту клавишу (или комбинацию клавиш), обработчик прерывания 9 устанавливает флаг запроса на активизацию TSR-программы и завершает свою работу обычным способом.
;Ваша TSR-программа должна создать свой обработчик прерывания 28h и сцепить его со стандартным. Каждый раз, когда DOS ожидает ввода с клавиатуры (в этот момент DOS не использует сама свои прерывания), вызывается прерывание 28h. Ваш обработчик проверяет флаг активизации, устанавливаемый обработчиком прерывания 9, и если флаг установлен, TSR-программа активизируется и может пользоваться услугами DOS, в частности, файловой системой.
;Разумеется, после выполнения всех необходимых действий TSR-программа должна сбросить флаг активизации.
0
0 / 0 / 0
Регистрация: 01.01.2010
Сообщений: 13
02.01.2010, 20:57  [ТС]
спасибо за информацию, но я это все сделал и все нормально работает. вот только не знаю как сохранить в файл изображение с области экрана. вот прочитал про прерывание int 10h, и ее функции 0dh-чтение пикселя в заданной точке экрана. удается сохранить один байт с экрана. но полностью всю область фигуры не получается. программа зависает. вот что я сделал:
Assembler
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
    
        mov cx,150
ly: push cx
    mov cx,150
lx:     push cx
        mov ah,0dh  ;чтение пикселя
    mov bh,0    ;страница
    mov cx,cs:x ;столбец
    mov dx,cs:y ;строка
    int 10h               ;в al результат
    stosb
    inc cs:x
    inc cs:kol
        pop cx
    loop lx
    mov x,0
    pop cx
    inc cs:y
    loop ly
 
    mov ah,40h
    mov bx,cs:handle
    mov cx,cs:kol
    mov dx,offset cs:bufin
    int 21h
правильно ли я делаю???
0
1779 / 757 / 153
Регистрация: 03.06.2009
Сообщений: 5,940
02.01.2010, 22:00
а сегментный регистр es настроен? А то я вижу, что вместо ds используется cs. Команда stosb сохраняет в es:di, да и для int 21h bufin должен быть не в cs:dx, а в ds:dx!
0
0 / 0 / 0
Регистрация: 01.01.2010
Сообщений: 13
02.01.2010, 22:05  [ТС]
это у меня в резидентной программе, и все переменные находятся в кодовом сегменте, так как программа .ком не может содержать сегмента данных
0
1779 / 757 / 153
Регистрация: 03.06.2009
Сообщений: 5,940
02.01.2010, 22:11
при чем здесь это? когда резидентная программа получает управление по прерыванию, все сегментные регистры кроме cs будут иметь произвольные значения! cs<>ds<>es. То есть они буду иметь значения, которые имели в программе пользователя до прерывания, и их нужно принудительно настроить.
0
0 / 0 / 0
Регистрация: 01.01.2010
Сообщений: 13
02.01.2010, 22:16  [ТС]
типа такого??? или я вас не понял...
Assembler
1
2
        push cs
    pop es
если не трудно можете объяснить на примере???
0
1779 / 757 / 153
Регистрация: 03.06.2009
Сообщений: 5,940
02.01.2010, 22:18
да, совершенно верно, и такое же нужно проделать с ds, и после этого это будет почти сом-программа)
0
0 / 0 / 0
Регистрация: 01.01.2010
Сообщений: 13
02.01.2010, 22:22  [ТС]
а вместо cs:bufin прописать ds:bufin???
зачем? ведь у нас нет сегмента данных???
0
1779 / 757 / 153
Регистрация: 03.06.2009
Сообщений: 5,940
02.01.2010, 22:25
требование функции 40h прерывания 21h, чтобы буфер находился в ds:dx, а не cs:dx и не в es:dx.
Функция будет искать его именно в ds:dx
0
0 / 0 / 0
Регистрация: 01.01.2010
Сообщений: 13
02.01.2010, 22:28  [ТС]
а как мне поступить в моем случае
0
1779 / 757 / 153
Регистрация: 03.06.2009
Сообщений: 5,940
02.01.2010, 22:30
думаю, настроить ds
Assembler
1
2
push cs
pop ds
и убрать префиксы cs
и естественно вернуть их в первоначальное положение перед выходом из обработчика
0
0 / 0 / 0
Регистрация: 01.01.2010
Сообщений: 13
02.01.2010, 22:38  [ТС]
меня смущает другое, то что я использую функцию 0dh прерывания int 10h. правильно ли я делаю??
или есть другие функции чтения пикселя с экрана?
0
1779 / 757 / 153
Регистрация: 03.06.2009
Сообщений: 5,940
03.01.2010, 15:26
другие - это только прямое обращение к видеопамяти, но в каждом режиме пиксель на экране шифруется по-разному. Если писать программу под какой-то конкретный видеорежим, то можно просто скопировать кусок видеопамяти.
0
0 / 0 / 0
Регистрация: 01.01.2010
Сообщений: 13
03.01.2010, 15:33  [ТС]
не подскажете как это сделать, привести пример если не трудно??? я работаю с режимом VGA, но можно и на других...
0
1779 / 757 / 153
Регистрация: 03.06.2009
Сообщений: 5,940
03.01.2010, 15:40
Есть пример только для текстового режима:
Assembler
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
New09Obrab  proc        ; новый обработчик прерывания int09h
 
    pushf           ; заносим флаги в стек, поскольку iret в конце оригинального обработчика заберет один экземпляр флагов из стека
    call    dword   ptr CS:[Old09]  ; вызов оригинального обработчика
    cli         ; запретить прерывания
    pushf           ; сохранить флаги
    pusha           ; сохранить регистры общего назначения
    mov cs:work,0   ; сбрасываем признак активации
    in  al,60h      ; читаем из порта клавиатуры скан-код нажатойй клавиши
    cmp     al,3bh      ; это f1?
    jz  fx_pressed
    cmp     al,3ch      ; это f2?
    jz  fx_pressed
    cmp     al,3dh      ; это f3?
    jz  fx_pressed
    cmp     al,3eh      ; это f4?
    jz  fx_pressed
    jmp skipwork    ; иначе просто пропускаем
fx_pressed:
    mov cs:work,1   ; устанавливаем признак активации
    sub al,3bh      ; по нажатой клавище получаем номер страницы: f1-0,f2-1,f3-2,f4-3
    mov ah,0
    shl ax,12       ; расчитываем смещение страницы
    push    es      ; сохраняем сегментные регистры, поскольку они не сохраняются командой pusha
    push    ds              ;
    push    cs      ; установка es:di в начало буфера программы и ds:si в начало страницы
    pop es
    push    0b800h
    pop ds
    mov si,ax       ; адрес начала страницы
    mov di, offset scrbuff; адрес начала буфера в памяти
    cld                     ; устанавливаем прямой режим увеличения адресов при работе со строковыми командами
    mov cx,0        ; обход страницы
    mov bl,80       ; делитель
scr:
    lodsw           ; команда загрузки из последовательности(цепочки) в аккумулятор AX
    stosb           ; сохраняем в цепочке только код символа
    inc cx      ; увеличиваем счетчик
    mov ax,cx
    div bl      
    test    ah,ah       ;достигнут ли конец строки экрана?
    jnz ncrlf
    mov ax,0a0dh    ;если да, то добавляем в буфер символы конца строки
    stosw
ncrlf:  cmp cx,2048     ;обходим пока не закончится видеостраница
    jnz scr
 
    pop ds      ; восстанавливаем сегментные регистры
    pop es
skipwork:
    popa            ; восстанавливаем регистры общего назначения
    popf            ; восстанавливаем флаги
    sti         ; разрешить прерывания
    iret            ; выход из прерывания
endp
 
New28Obrab  proc        ; новый обработчик прерывания int28h
 
    pushf           ; заносим флаги в стек, поскольку iret в конце оригинального обработчика заберет один экземпляр флагов из стека
    call    dword   ptr CS:[Old28]  ; вызов оригинального обработчика
    pushf           ; сохранить флаги
    pusha           ; сохранить регистры общего назначения
    cmp cs:work,1   ; проверяем фдаг активации
    jnz skip28      ; выход из обработчика, если флаг сброшен
    push    es      ; сохраняем сегментные регистры, поскольку они не сохраняются командой pusha
    push    ds              ;
    push    cs      ; установка es и ds равным cs
    pop es
    push    es
    pop ds
    mov ah,41h      ;удаляем файл page.txt(если он есть), чтобы не мешать созданию нового
    mov dx,offset fname
    int 21h
    mov ah,3ch      ;создаем файл page.txt
    mov cx,0
    mov dx,offset fname
    int 21h
    jc  stop28      ;если ошибка, то пропускаем дальнейшие файловые операции
    mov handle,ax   ;сохраняем хэндл
    mov bx,ax
    mov ah,40h      ;записываем на диск сожержимое буфера
    mov cx,800h + 26*2
    mov dx,offset scrbuff
    int 21h
    jc  stop28
    mov bx,handle   ;и закрываем файл
    mov ah,3eh
    int 21h
 
 
 
stop28: mov cs:work,0   ;сбрасываем флаг активации
    pop ds      ; восстанавливаем сегментные регистры
    pop es
skip28:
    popa            ; восстанавливаем регистры общего назначения
    popf            ; восстанавливаем флаги
    iret            ; выход из прерывания
0
0 / 0 / 0
Регистрация: 01.01.2010
Сообщений: 13
03.01.2010, 17:10  [ТС]
спасибо но кажется это не поможет для моего примера... а нет других примеров считывания с экрана... вот я нашел примерчик вот тока не понял как там делается... сможете урезать код чтоб только сохранял в файл, и не перехватывал никаких прерывании. можно под .exe файл
Вложения
Тип файла: rar scrgrb.rar (7.6 Кб, 41 просмотров)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.01.2010, 17:10
Помогаю со студенческими работами здесь

Сохранить сформированное изображение в файл
Добрый день, я загружаю на окно изображение из файла, затем рисую на нем QPainter -ом, а как...

Как сохранить в файл изображение?
есть переменная CBitmap* m_pBitmap=(CBitmap*)hGlob; Как ее сохранить в файл в виде bmp или png файлов????

Как сохранить изображение в файл?
Подскажите, плиз, как сохранить изображение в файл, после того, как ты загрузил его LoadImage и немного поихменял?

Сохранить изображение с Panel в файл
С компонента Image можно сохранять изображение в файл через Picture. Возможно осуществить такоеже с компонентом Panel?

Сохранить изображение с PictureBox в файл
Приветствую! Если:PictureBox.Image = Image.FromFile(&quot;D:\Izo\C4.gif&quot;) дает нам возможность загружать с диска. А как при необходимости...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
[В процессе разработки] SDL3 для Web (WebAssembly): Сборка библиотек SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru