![]() |
Модераторы: Snowy, MetalFan, bems, Poseidon |
![]() ![]() ![]() |
|
Proxin |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 363 Регистрация: 21.6.2008 Репутация: 1 Всего: 3 |
В общем, как? Известна высота изображения и ширина. Рылся в сети - ничего не нашёл.
|
|||
|
||||
artsb |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2280 Регистрация: 17.7.2007 Где: центр Вселенной Репутация: 1 Всего: 64 |
? -------------------- Чем отличается умный человек от мудрого? Умный - выпутается из любой ситуации. Мудрый - просто в неё не попадёт. |
|||
|
||||
Proxin |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 363 Регистрация: 21.6.2008 Репутация: 1 Всего: 3 |
Гениально, да. Но не то.
У меня есть файлстрим, в который напихана ещё куча информации. С определённой позиции начианается рисунок. Конец рисунка - не конец файла. Я знаю размеры рисунка (высота и ширина). Куда мне его можно считать и как вывести потом на bitmap? |
|||
|
||||
artsb |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2280 Регистрация: 17.7.2007 Где: центр Вселенной Репутация: 1 Всего: 64 |
Как вы задали вопрос, так я и ответил ![]() Устанавливаете позицию курсора в потоке на нужную позицию и ...
Всё будет ОК ;) Добавлено @ 20:48 Ну и что? LoadFromStream знает когда остановиться. Это сообщение отредактировал(а) artsb - 26.12.2009, 20:48 -------------------- Чем отличается умный человек от мудрого? Умный - выпутается из любой ситуации. Мудрый - просто в неё не попадёт. |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 34 Всего: 459 |
Можно создать промежуточный TMemoryStream и в него сливать картинку. Добавлено через 1 минуту и 51 секунду К сожалению нет. TBitmap тупо читает до конца файла. В связи с этим иногда бывают проблемы, в частности с битмапами 64х64, 256х256 (текстуры) -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
artsb |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2280 Регистрация: 17.7.2007 Где: центр Вселенной Репутация: 1 Всего: 64 |
Странно. Я много раз так делал. До сих пор никаких проблем не было... Добавлено через 2 минуты и 14 секунд Тогда можно при сохранении, сначала сохранить изображение в промежуточный поток, потом в основной поток записать размер потока с картинкой и саму картинку. А при чтении читаем размер картинки, а потом во временный поток саму картинку и уже из него в битмап. -------------------- Чем отличается умный человек от мудрого? Умный - выпутается из любой ситуации. Мудрый - просто в неё не попадёт. |
|||
|
||||
Proxin |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 363 Регистрация: 21.6.2008 Репутация: 1 Всего: 3 |
Вот так должно быть?
|
|||
|
||||
artsb |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2280 Регистрация: 17.7.2007 Где: центр Вселенной Репутация: 1 Всего: 64 |
Напишу на С++
Добавлено @ 22:16 А. Ну да. Только установка ширины и высоты излишни. И читайте кусок потока через метод CopyFrom. А перед этой строкой:
Обязательно позицию курсора в ноль нужно поставить. Иначе ничего не выйдет ![]() Это сообщение отредактировал(а) artsb - 26.12.2009, 22:40 -------------------- Чем отличается умный человек от мудрого? Умный - выпутается из любой ситуации. Мудрый - просто в неё не попадёт. |
||||
|
|||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 34 Всего: 459 |
Вот это вызывает сомнение
filestr.read(memorystr,bytescount); Думаю тут должен быть CopyFrom -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
artsb |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2280 Регистрация: 17.7.2007 Где: центр Вселенной Репутация: 1 Всего: 64 |
Упс. Вы правы. А я почему-то везде написал просто Copy. ![]() Добавлено через 2 минуты и 18 секунд мне кажется, что это вообще работать не должно. -------------------- Чем отличается умный человек от мудрого? Умный - выпутается из любой ситуации. Мудрый - просто в неё не попадёт. |
|||
|
||||
Proxin |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 363 Регистрация: 21.6.2008 Репутация: 1 Всего: 3 |
сделал с помощью copyfrom. появляется ошибка "bitmap image is not valid" - это значит, что я его не оттуда копирую?
|
|||
|
||||
artsb |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2280 Регистрация: 17.7.2007 Где: центр Вселенной Репутация: 1 Всего: 64 |
Возможно... А в поток вы как сохраняли? SaveToStream? -------------------- Чем отличается умный человек от мудрого? Умный - выпутается из любой ситуации. Мудрый - просто в неё не попадёт. |
|||
|
||||
Proxin |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 363 Регистрация: 21.6.2008 Репутация: 1 Всего: 3 |
Это вообще не мой файл - пытаюсь делать парсилку по открытому формату.
Описание дано так: screenshotdata=3*width*height. Width и height я получаю правильно, смотрел с помощью другой парсилки. А вот сам битмап получить по этой технологии уже как-то не получается. Ещё заметил, что начало файла как-то странно читается - если даже сиком позицию после открытия установить в ноль, то символы читаются начиная со второго только. |
|||
|
||||
artsb |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2280 Регистрация: 17.7.2007 Где: центр Вселенной Репутация: 1 Всего: 64 |
Ещё бы знать, как они сохраняют картинку... А вы уверены, что там битмап? Может там JPEG?
Не понял. Где разворачиваются события? Добавлено через 7 минут и 1 секунду Побольше бы информации... -------------------- Чем отличается умный человек от мудрого? Умный - выпутается из любой ситуации. Мудрый - просто в неё не попадёт. |
|||
|
||||
Proxin |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 363 Регистрация: 21.6.2008 Репутация: 1 Всего: 3 |
rgb - три бита на пиксель без компрессии есть битмап самый натуральный. или я не прав?
ещё, если это поможет - вот описание структуры файла. конкретно интересует поле screenshot. может, я что-то неправильно понял (ширину и высоту получаю нормально) ? Это сообщение отредактировал(а) Proxin - 22.3.2010, 15:47 |
|||
|
||||
artsb |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2280 Регистрация: 17.7.2007 Где: центр Вселенной Репутация: 1 Всего: 64 |
ну да, по идее. А вы пробовали так читать:
? Добавлено @ 23:45 А до скриншота всё нормально считывается? Добавлено через 9 минут и 6 секунд мне кажется, это связано с тем, что в файле битмап хранится без шапки, т.е. только биты. Попробуйте так:
где bits массив битов прочитанных из файла Это сообщение отредактировал(а) artsb - 26.12.2009, 23:46 -------------------- Чем отличается умный человек от мудрого? Умный - выпутается из любой ситуации. Мудрый - просто в неё не попадёт. |
||||||
|
|||||||
Proxin |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 363 Регистрация: 21.6.2008 Репутация: 1 Всего: 3 |
Да, до скриншота всё нормально.
А так и читаю:
|
|||
|
||||
Proxin |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 363 Регистрация: 21.6.2008 Репутация: 1 Всего: 3 |
А как эти биты считать именно в массив? Они считываются в int64 только.
|
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 34 Всего: 459 |
3*w*h этого мало. Нужно еще sizeof(BITMAPINFOHEADER), sizeof(BITMAPFILEHEADER) и кроме того учесть 2 выравнивания. 1е выравнивание каждой строки на границу 4х байт + выравнивание всего растра на границу 4х байт. Подробнее можно тут почитать http://forum.vingrad.ru/topic-94227.html
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
artsb |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2280 Регистрация: 17.7.2007 Где: центр Вселенной Репутация: 1 Всего: 64 |
Proxin, пришли мне на мыло файлик или выложи и пришли ссылку в личку. Завтра в обед приду, покумекаю.
-------------------- Чем отличается умный человек от мудрого? Умный - выпутается из любой ситуации. Мудрый - просто в неё не попадёт. |
|||
|
||||
artsb |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2280 Регистрация: 17.7.2007 Где: центр Вселенной Репутация: 1 Всего: 64 |
Получилось:
![]()
Это сообщение отредактировал(а) artsb - 27.12.2009, 13:47 -------------------- Чем отличается умный человек от мудрого? Умный - выпутается из любой ситуации. Мудрый - просто в неё не попадёт. |
|||
|
||||
Proxin |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 363 Регистрация: 21.6.2008 Репутация: 1 Всего: 3 |
И ничего... не силён я в переводе с си на паскаль.
Вот как делаю: Картинка получается абсолютно чёрной. Это сообщение отредактировал(а) Proxin - 22.3.2010, 15:49 |
|||
|
||||
artsb |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2280 Регистрация: 17.7.2007 Где: центр Вселенной Репутация: 1 Всего: 64 |
Мне кажется, вы неправильно длину массива bta устанавливаете...
Как в Делфи создать динамический массив? -------------------- Чем отличается умный человек от мудрого? Умный - выпутается из любой ситуации. Мудрый - просто в неё не попадёт. |
|||
|
||||
Proxin |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 363 Регистрация: 21.6.2008 Репутация: 1 Всего: 3 |
объявляется переменная array of что-то. затем с помощью setlength ей задаётся длина.
|
|||
|
||||
artsb |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2280 Регистрация: 17.7.2007 Где: центр Вселенной Репутация: 1 Всего: 64 |
Proxin, вы действительно неверно создаёте массив. Написал так:
и всё заработало. Только индексы в циклах начинаются с 1. Добавлено @ 15:12 setlength это для строк. Добавлено @ 15:14 ![]() Это сообщение отредактировал(а) artsb - 27.12.2009, 15:16 -------------------- Чем отличается умный человек от мудрого? Умный - выпутается из любой ситуации. Мудрый - просто в неё не попадёт. |
|||
|
||||
Proxin |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 363 Регистрация: 21.6.2008 Репутация: 1 Всего: 3 |
Спасибо Вам большое за помощь. Всё работает.
|
|||
|
||||
artsb |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2280 Регистрация: 17.7.2007 Где: центр Вселенной Репутация: 1 Всего: 64 |
Но, конечно же, нужно всё реализовать так, чтобы массив создавался динамически.
-------------------- Чем отличается умный человек от мудрого? Умный - выпутается из любой ситуации. Мудрый - просто в неё не попадёт. |
|||
|
||||
Proxin |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 363 Регистрация: 21.6.2008 Репутация: 1 Всего: 3 |
а как установить его длину тогда правильно? во всех мануалах пишут setlength.
|
|||
|
||||
artsb |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2280 Регистрация: 17.7.2007 Где: центр Вселенной Репутация: 1 Всего: 64 |
Я знаю как на С++. ![]() По крайней мере, в хелпе эта функция относится к строкам. А может вы просто bta не правильно объявили? -------------------- Чем отличается умный человек от мудрого? Умный - выпутается из любой ситуации. Мудрый - просто в неё не попадёт. |
|||
|
||||
artsb |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2280 Регистрация: 17.7.2007 Где: центр Вселенной Репутация: 1 Всего: 64 |
Написал так:
i равно 0. -------------------- Чем отличается умный человек от мудрого? Умный - выпутается из любой ситуации. Мудрый - просто в неё не попадёт. |
|||
|
||||
bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 18 Всего: 88 |
Эта функция работает и для динамических массивов. Это известно всем, кто прочитал хоть один учебник по языку.
1) проверить что w и h больше нуля 2) проверить значение i не встроенным отладчиком а например так
-------------------- Обижено школьников: 8 |
|||
|
||||
artsb |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2280 Регистрация: 17.7.2007 Где: центр Вселенной Репутация: 1 Всего: 64 |
Я не читал ![]() 100% больше нуля Добавлено @ 18:01
Сейчас проверил. Всё ОК. Массив заполнен нулями. Поэтому картинка чёрная. Значит не происходит чтения из потока. Не верно передаём указатель? Добавлено @ 18:11 Ха. Вот так работает:
Странно у вас всё в Делфи ![]() Это сообщение отредактировал(а) artsb - 27.12.2009, 18:12 -------------------- Чем отличается умный человек от мудрого? Умный - выпутается из любой ситуации. Мудрый - просто в неё не попадёт. |
||||
|
|||||
bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 18 Всего: 88 |
Да нормально всё у нас.
Для динамического массива bta и bta[0] это разные вещи, потому что bta это ссылка на первый элемент -------------------- Обижено школьников: 8 |
|||
|
||||
artsb |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2280 Регистрация: 17.7.2007 Где: центр Вселенной Репутация: 1 Всего: 64 |
не сомневаюсь ;) в С++ это указатель на массив. Это сообщение отредактировал(а) artsb - 27.12.2009, 18:37 -------------------- Чем отличается умный человек от мудрого? Умный - выпутается из любой ситуации. Мудрый - просто в неё не попадёт. |
|||
|
||||
bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 18 Всего: 88 |
Ну я назвал ссылкой условно. Физически это указатель на первый элемент, но синтаксически к элементам обращаются без ^
Ну по ходу получается то же самое. А первый параметр read это var-параметр, он и так передается по ссылке. Таким образом когда ты вызываешь f.read(bta, 3*w*h) в метод передается адрес адреса первого элемента. А для статического массива работало, потому что у него переменная-массив лежит по тому же адресу что и первый элемент. Форма f.read(bta[0], 3*w*h) будет работать в обоих случаях (для статического массива еще есть условие что он должен начинаться с нуля) А вот так совсем универсально
-------------------- Обижено школьников: 8 |
|||
|
||||
artsb |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2280 Регистрация: 17.7.2007 Где: центр Вселенной Репутация: 1 Всего: 64 |
Спасибо за разъяснение. В принципе, в С++ то же самое. Только в функцию Read передаётся именно указатель на буфер. -------------------- Чем отличается умный человек от мудрого? Умный - выпутается из любой ситуации. Мудрый - просто в неё не попадёт. |
|||
|
||||
Proxin |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 363 Регистрация: 21.6.2008 Репутация: 1 Всего: 3 |
Переделал всё с динамическим массивом. Работает так, как описал artsb.
И ещё вопрос. Почему a string perfixed with a byte length не читается полностью? Пишу так:
Строка читается, но без первой буквы. UPD: А вот так
Читаются все строки нормально, но без последенй буквы. В чём может быть дело? Вообще, есть ли хороший материал по потокам - где детально всё на примерах расписано? Это сообщение отредактировал(а) Proxin - 27.12.2009, 19:23 |
||||
|
|||||
artsb |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2280 Регистрация: 17.7.2007 Где: центр Вселенной Репутация: 1 Всего: 64 |
Proxin, проверил под BCB 6. Всё отлично работает без Seek (с ним наоборот мусор). Значит это уже нюансы языка (Object Pascal). Здесь я, к сожалению, помочь не могу.
ЗЫ обожаю С++ ![]() -------------------- Чем отличается умный человек от мудрого? Умный - выпутается из любой ситуации. Мудрый - просто в неё не попадёт. |
|||
|
||||
bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 18 Всего: 88 |
Попробуй так
Добавлено через 12 минут и 31 секунду Это неверно, потому что есть еще ноль в конце -------------------- Обижено школьников: 8 |
|||
|
||||
bems |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 18 Всего: 88 |
Тебе нужно посмотреть на файл в хексредакторе и определить включается ли терминатор в байт длины.
Если нет, то так
А если да, то
-------------------- Обижено школьников: 8 |
||||
|
|||||
Proxin |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 363 Регистрация: 21.6.2008 Репутация: 1 Всего: 3 |
Спасибо. Понял.
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |