Модераторы: Snowy, MetalFan, bems, Poseidon

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Bitmap и TFileStream, Как вытащить первое из второго? 
V
    Опции темы
artsb
Дата 26.12.2009, 23:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 1
Всего: 64



Цитата(Proxin @  26.12.2009,  23:30 Найти цитируемый пост)
rgb - три бита на пиксель без компрессии есть битмап самый натуральный. или я не прав?

ну да, по идее.
А вы пробовали так читать:
Код

mybitmap = new Graphics::TBitmap();
TMemoryStream *str = new TMemoryStream();
str->CopyFrom(filestr, 3*height*width);
str->Position = 0;
mybitmap->LoadFromStream(str);
delete str;

?

Добавлено @ 23:45
А до скриншота всё нормально считывается?

Добавлено через 9 минут и 6 секунд
Цитата(Proxin @  26.12.2009,  22:52 Найти цитируемый пост)
появляется ошибка "bitmap image is not valid"

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

mybitmap->Width = width;
mybitmap->Height = height;
unsigned pos = 0;
for(int i=0; i<height; i++)
 for(int k=0; k<width; k++) {
  mybitmap->Pixels[k][i] = RGB(bits[pos], bits[pos+1], bits[pos+2]);
  pos +=3;
 }

где bits массив битов прочитанных из файла

Это сообщение отредактировал(а) artsb - 26.12.2009, 23:46


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Proxin
Дата 26.12.2009, 23:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 363
Регистрация: 21.6.2008

Репутация: 1
Всего: 3



Да, до скриншота всё нормально.
А так и читаю:
Код

bs:=tmemorystream.create;
bs.copyfrom(f,3*w*h);
bs.position:=0;
bm:=tbitmap.create;
bm.loadfromstream(bs);

PM MAIL   Вверх
Proxin
Дата 27.12.2009, 00:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 363
Регистрация: 21.6.2008

Репутация: 1
Всего: 3



А как эти биты считать именно в массив? Они считываются в int64 только.
PM MAIL   Вверх
Alexeis
Дата 27.12.2009, 00:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 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 вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
artsb
Дата 27.12.2009, 00:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 1
Всего: 64



Proxin, пришли мне на мыло файлик или выложи и пришли ссылку в личку. Завтра в обед приду, покумекаю.


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
artsb
Дата 27.12.2009, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 1
Всего: 64



Получилось:
user posted image
Код

// после того, как остальное прочитали
byte *bb = new byte[3*w*h];
f->Read(bb, 3*w*h);
bm = new Graphics::TBitmap();
bm->PixelFormat = pf32bit;
bm->Height = h;
bm->Width = w;
pos = 0;
for(int i=0; i<h; i++)
 for(int k=0; k<w; k++) {
  bm->Canvas->Pixels[k][i] = RGB(bb[pos], bb[pos+1], bb[pos+2]);
  pos+=3;
 }
Image1->Picture->Bitmap->Assign(bm);
delete bm;
delete [] bb;


Это сообщение отредактировал(а) artsb - 27.12.2009, 13:47


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Proxin
Дата 27.12.2009, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 363
Регистрация: 21.6.2008

Репутация: 1
Всего: 3



И ничего... не силён я в переводе с си на паскаль.
Вот как делаю:

Картинка получается абсолютно чёрной.

Это сообщение отредактировал(а) Proxin - 22.3.2010, 15:49
PM MAIL   Вверх
artsb
Дата 27.12.2009, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 1
Всего: 64



Мне кажется, вы неправильно длину массива bta устанавливаете...
Как в Делфи создать динамический массив?


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Proxin
Дата 27.12.2009, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 363
Регистрация: 21.6.2008

Репутация: 1
Всего: 3



объявляется переменная array of что-то. затем с помощью setlength ей задаётся длина.
PM MAIL   Вверх
artsb
Дата 27.12.2009, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 1
Всего: 64



Proxin, вы действительно неверно создаёте массив. Написал так:
Код

bta: array [0..150000] of byte;

и всё заработало.
Только индексы в циклах начинаются с 1.

Добавлено @ 15:12
Цитата(Proxin @  27.12.2009,  15:10 Найти цитируемый пост)
затем с помощью setlength ей задаётся длина. 

setlength это для строк.

Добавлено @ 15:14
user posted image

Это сообщение отредактировал(а) artsb - 27.12.2009, 15:16


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Proxin
Дата 27.12.2009, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 363
Регистрация: 21.6.2008

Репутация: 1
Всего: 3



Спасибо Вам большое за помощь. Всё работает.
PM MAIL   Вверх
artsb
Дата 27.12.2009, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 1
Всего: 64



Но, конечно же, нужно всё реализовать так, чтобы массив создавался динамически.


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Proxin
Дата 27.12.2009, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 363
Регистрация: 21.6.2008

Репутация: 1
Всего: 3



а как установить его длину тогда правильно? во всех мануалах пишут setlength. 
PM MAIL   Вверх
artsb
Дата 27.12.2009, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 1
Всего: 64



Цитата(Proxin @  27.12.2009,  15:51 Найти цитируемый пост)
а как установить его длину тогда правильно?

Я знаю как на С++. smile
Цитата(Proxin @  27.12.2009,  15:51 Найти цитируемый пост)
во всех мануалах пишут setlength.  

По крайней мере, в хелпе эта функция относится к строкам. А может вы просто bta не правильно объявили?


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
artsb
Дата 27.12.2009, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 1
Всего: 64



Написал так:
Код

setlength(bta, 3*w*h);
i := Length(bta);

i равно 0.


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0791 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.