Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.04.2012, 09:43   #1
Sёker
Пользователь
 
Регистрация: 30.09.2011
Сообщений: 27
По умолчанию Запись трёхмерного динамического массива в TFileStream

Создаю 3D динамический массив байт M (HxWx4) и файловый поток SBMЗ. Записываю массив в файловый поток нижеследующим образом:
SBMP.Write(M,H*W*4);
Ничего не записывается. В чём ошибка?
Sёker вне форума Ответить с цитированием
Старый 21.04.2012, 10:23   #2
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,876
По умолчанию

Динамический 3д массив - суть указатель на массив указателей, которые в свою очередь указывают на массив указателей, указывающих на массивы данных.
Записывать лучше строго в цикле примерно так
Код:
for i := 0 to h - 1 do
for j := 0 to w - 1 do
for k := 0 to 4 -1 do
SBMP.Write(M[i,j,k], sizeof(byte));
Непонятен Ваш оверхед, правда, для записи картинок RGBA (тем более у Вас по идее 32-бит бмп) дано придуманы готовые системы, поищите.
phomm вне форума Ответить с цитированием
Старый 21.04.2012, 11:17   #3
Sёker
Пользователь
 
Регистрация: 30.09.2011
Сообщений: 27
По умолчанию

Цитата:
Сообщение от phomm Посмотреть сообщение
Динамический 3д массив - суть указатель на массив указателей, которые в свою очередь указывают на массив указателей, указывающих на массивы данных.
Записывать лучше строго в цикле примерно так
Код:
for i := 0 to h - 1 do
for j := 0 to w - 1 do
for k := 0 to 4 -1 do
SBMP.Write(M[i,j,k], sizeof(byte));
Непонятен Ваш оверхед, правда, для записи картинок RGBA (тем более у Вас по идее 32-бит бмп) дано придуманы готовые системы, поищите.
Премного благодарен за ответ.
Говоря о готовых системах вы наверное намекаете на TBitMap. Но к сожалению, действуя например по такой схеме:
var
BM:TBitMap;
...
BM.Canvas.Pixels[x,y]:=...
...
Image1.Picture.Assign(BM)
...,
я натолкнулся на проблему. Если количество пикселей превышает 4210753, лишние пиксели закрашиваются не заданными цветами, а произвольными. Я не совсем понимаю на что наложено ограничение в 4210753. Поскольку загружая BMP файл с изображением, превышающим данное число, в битмап и выводя битмап на Image, все пиксели отображаются правильно.
И, благодаря этому, для правильного отображения большого количества пикселей, я решил использовать BMP-файл как посредник.
Буду благодарен, если вы посоветуете более продвинутое решение.

Последний раз редактировалось Sёker; 21.04.2012 в 11:20.
Sёker вне форума Ответить с цитированием
Старый 21.04.2012, 12:46   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Код:
for i := 0 to h - 1 do
for j := 0 to w - 1 do
SBMP.Write(M[i,j,0], sizeof(byte)*4);
так быстрее.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
передача трёхмерного массива в функцию Dimarik Общие вопросы C/C++ 2 21.03.2011 16:33
запись динамического массива в файловый поток Jor1k Общие вопросы Delphi 8 30.10.2010 01:49
Трёхмерная визулизация трёхмерного массива atomohod Мультимедиа в Delphi 5 03.04.2010 14:57
Память для трёхмерного массива и другие задачи Bloodykeeper Общие вопросы C/C++ 10 11.01.2010 18:12
Не могу выделить память для трёхмерного массива Blister Помощь студентам 3 19.12.2007 07:25