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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.04.2012, 20:23   #1
DCxDemo
Пользователь
 
Регистрация: 16.04.2012
Сообщений: 17
По умолчанию одномерный массив -> изображение на форме

имеется одномерный массив байт, каждые 4 байта - пиксель RGBA. все строки картинки идут подряд. как можно быстренько вывести это дело на канву?
можно конечно генерировать bmp в папке с программой, но по-моему это не самое изящное решение.
DCxDemo вне форума Ответить с цитированием
Старый 18.04.2012, 22:20   #2
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

http://programmersforum.ru/showthread.php?t=84340
Если помог, проси поставить минус. Будь оригинален!
Rin вне форума Ответить с цитированием
Старый 18.04.2012, 23:56   #3
DCxDemo
Пользователь
 
Регистрация: 16.04.2012
Сообщений: 17
По умолчанию

можно поподробней, как перевод из 24 бит в 32 должен мне помочь, если у меня и так 32?
DCxDemo вне форума Ответить с цитированием
Старый 19.04.2012, 00:24   #4
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

Код:
type 
rgba=record
r,g,b,a:byte;
n=100;
var
b:TBitMap;
m:array[1..n] of rgba;
i,j:integer;
begin
.............
b:=TBitmap.Create;
b.pixelformat:=pf32bit;
b.width:=10;
b.height:=round(n/b.width);
for i:=1 to b.Width do
for j:=1 to b.Height do
b.canvas.Pixels[i,j]:=(m[i*j].r or (m[i*j].g shl 8) or (m[i*j].b shl 16)or (m[i*j].a shl 24));
BitBlt(form1.Canvas.Handle, 0, 0, b.Width, b.Height, b.canvas.Handle, 0,0, SrcCopy);
b.Free;
Правда более быстрый алгоритм будет с помощью scanline, а не pixels[].
Если помог, проси поставить минус. Будь оригинален!

Последний раз редактировалось Rin; 19.04.2012 в 00:27.
Rin вне форума Ответить с цитированием
Старый 19.04.2012, 03:58   #5
DCxDemo
Пользователь
 
Регистрация: 16.04.2012
Сообщений: 17
По умолчанию

при использовании BitBlt, при повторном вызове этой процедуры для другой текстуры, ничего не меняется. если заменить на Draw, то работает нормально, картинка размером 512x512 рисуется с задержкой. терпимо конечно...
DCxDemo вне форума Ответить с цитированием
Старый 19.04.2012, 04:57   #6
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

Не встречал такой проблемы с ditblt. Посмотрите ЗДЕСЬ работу со сканлайном, ваша текстура будет грузиться намного быстрее. Если зальете сырцы, то можно будет разобраться в чем трабл. При устовии, что не используете никаких компонентов из Delphi7 и выше.
Если помог, проси поставить минус. Будь оригинален!

Последний раз редактировалось Rin; 19.04.2012 в 05:00.
Rin вне форума Ответить с цитированием
Старый 19.04.2012, 23:26   #7
DCxDemo
Пользователь
 
Регистрация: 16.04.2012
Сообщений: 17
По умолчанию

да, я использовал компонент Image, при выводе на форму, всё хорошо. думаю на форму и буду выводить, проще центрировать.
попутно пару вопросов, как стереть картинку (попробовал invalidate перед bitblt, но картинка исчезает практически сразу)
и можно ли работать с прозрачностью (вот это or (m[i*j].a shl 24) выдаёт очень странный результат, большинство картинок становятся чёрными, иногда виден белый контур нарисованного. где-то в примерах нашёл, что это не значение прозрачности, а режим отрисовки...)
DCxDemo вне форума Ответить с цитированием
Старый 20.04.2012, 00:26   #8
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

На форму лучше не выводить. А отчистить можно так
Код:
image1.picture:=nil;
Цитата:
где-то в примерах нашёл, что это не значение прозрачности, а режим отрисовки...)
Ну думаю, что с форматом количества бит на пиксель у BMP поспорить будет сложно.
Возможно, что нужно использовать формат не RGBA, а AGBR.
тогда и формула будет перевернутой:
Код:
(m[i*j].a or (m[i*j].b shl 8) or (m[i*j].g shl 16)or (m[i*j].r shl 24)
Если помог, проси поставить минус. Будь оригинален!

Последний раз редактировалось Rin; 20.04.2012 в 00:29.
Rin вне форума Ответить с цитированием
Старый 20.04.2012, 02:21   #9
DCxDemo
Пользователь
 
Регистрация: 16.04.2012
Сообщений: 17
По умолчанию

дело не в bmp, а в TColor видимо. получается, что первый байт, это не альфа канал... любое значение отличное от нуля делает с картинкой страшные вещи))

//На форму лучше не выводить.//
почему так? у меня есть область внизу формы и я хочу чтобы картинка рисовалась посередине этой области, но у меня не получается привязать Image к форме так, чтобы при изменении размеров, менялась и область зарисовки. она остаётся такой же как и при первом вызове.
DCxDemo вне форума Ответить с цитированием
Старый 20.04.2012, 04:54   #10
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

На событии OnResize у формы изменяй размеры Image. Попробуй сохранить свой массив в файл, открыть его в фотошопе и глянуть, есть ли там альфаканал. Глянь кстати эту тему.
Если помог, проси поставить минус. Будь оригинален!
Rin вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Одномерный массив и Двумерный массив eugene1437 Общие вопросы C/C++ 15 25.05.2011 19:17
Изображение с рваными краями на форме apromix Общие вопросы Delphi 3 02.03.2011 15:47
Одномерный массив , двухмерный массив Woxx Паскаль, Turbo Pascal, PascalABC.NET 0 10.09.2010 09:28
Одномерный массив. Q basic - Построить новый массив из элементов исходного ,которые больше P. Marishkaa Помощь студентам 2 12.01.2010 16:54
Двумерный массив, одномерный массив. Branbal Помощь студентам 14 18.11.2009 12:40