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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> BMP image в массив 
:(
    Опции темы
fen1ksss
Дата 14.9.2010, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



В общем есть картинка bmp формата, нужно разбить эту картинку на RGB и загнать в массив (скорее всего 3 мерный где каждый элемент это r,g,b соответсвенно) для дальнейшей работы с изображением через массив.
Дело в том что как работать с черно-белым понимаю, а как цветное на RGB разбить немного не понимаю, подскажите
PM MAIL   Вверх
UniBomb
Дата 14.9.2010, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 1754
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 97



fen1ksss, тут всё описано.
PM MAIL ICQ Skype   Вверх
fen1ksss
Дата 14.9.2010, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(UniBomb @ 14.9.2010,  18:17)
fen1ksss, тут всё описано.

Тогда здесь RowProcessed[i].rgbtRed содержится 256 оттенков красного?

тогда грубо говоря если я хочу вывести этот массив с красным цветом на форму, то пишу

Код

Canvas.Pixels[i,j]:=RowProcessed[i].rgbtRed;


и выводит, я правильно понимаю?
PM MAIL   Вверх
UniBomb
Дата 14.9.2010, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 1754
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 97



Цитата(fen1ksss @  14.9.2010,  20:06 Найти цитируемый пост)
Тогда здесь RowProcessed[i].rgbtRed содержится 256 оттенков красного?

Нет, тут содержится красная составляющая i-того пикселя j-той строки. ScanLine читает изображения по-строчно, выдавая на гора массив значений в формате, определённым PixelFormat. RGB - это модель цветапредставления в виде трёх составляющих - красной, зелёной и синей.

Допустим у тебя есть картинка 16*16 пикселей. Тогда:

Код

ProcessedBitmap.PixelFormat = pf24bit;
RowProcessed := pRGBArray(ProcessedBitmap.Scanline[0]) //будет содержать одномерный массив TRGBTriple в количестве 16-ти элементов


Далее - Допустим верхний левый пиксель имеет чиленное значение цвета, равное 0xFF0000. Т.е. он красный. Тогда:

Код

RowProcessed[0].rgbtRed //тут будет хранится значение 0xFF

Для вывода цвета надо каждую состовляющую поставить на своё место и сложить всё это друг с другом.
Canvas.Pixels[i,j]:=(RowProcessed[i].rgbtRed << 16) + (RowProcessed[i].rgbtGreen << 8) + RowProcessed[i].rgbtBlue;

PM MAIL ICQ Skype   Вверх
Alexeis
Дата 14.9.2010, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



UniBomb, в делфях нет оператора "<<" . Он называется shl


--------------------
Vit вечная память.

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

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


Новичок



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

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



Цитата(UniBomb @  14.9.2010,  20:22 Найти цитируемый пост)
Тогда здесь RowProcessed[i].rgbtRed содержится 256 оттенков красного?Нет, тут содержится красная составляющая i-того пикселя j-той строки. 

А каждая красная составляющая как раз и может принимать одно из 256 значений взависимости от оттенка красного?

Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

CONST
  PixelCountMax = 32768;

TYPE
  pRGBArray = ^TRGBArray;
  TRGBArray = ARRAY[0..PixelCountMax-1] OF TRGBTriple;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  OriginalBitmap:TBitmap;
  ProcessedBitmap:TBitmap;
  i,j:integer;
  RowOriginal:pRGBArray;
  RowProcessed:pRGBArray;

implementation

{$R *.dfm}

procedure CreateBMP;
begin
if OriginalBitmap.PixelFormat <> pf24bit then
  begin
    ShowMessage('Изображение должно быть 24-х битным');
    Exit;
  end;

{Шаг через каждую строчку изображения.}
for j:=OriginalBitmap.Height-1 downto 0 do
begin
  RowOriginal:=pRGBArray(OriginalBitmap.Scanline[j]);
  RowProcessed:=pRGBArray(ProcessedBitmap.Scanline[j]);

  for i:=OriginalBitmap.Width-1 downto 0 do
  begin

    //Доступ к RGB-цветам отдельных пикселей должен осуществляться следующим образом:
    RowProcessed[i].rgbtRed:=RowOriginal[i].rgbtRed;
    RowProcessed[i].rgbtGreen:=RowOriginal[i].rgbtGreen;
    RowProcessed[i].rgbtBlue:=RowOriginal[i].rgbtBlue;
  end;
end;
Form1.Canvas.Pixels[i,j]:=(RowProcessed[i].rgbtRed shl 16)+
(RowProcessed[i].rgbtGreen shl 8) +
RowProcessed[i].rgbtBlue;
end;


Если допустим использую 

Код

procedure TForm1.Button1Click(Sender: TObject);
begin
  OriginalBitmap.LoadFromFile('a.bmp');
  createbmp;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
   OriginalBitmap:=TBitmap.Create;
end;


пишет ошибку, в чем проблема? Изображение 'a.bmp' 800x600

Это сообщение отредактировал(а) fen1ksss - 14.9.2010, 21:32
PM MAIL   Вверх
UniBomb
Дата 14.9.2010, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 1754
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 97



Alexeis, я значит не зря сомневался  smile 


Цитата(fen1ksss @  14.9.2010,  21:47 Найти цитируемый пост)
А каждая красная составляющая как раз и может принимать одно из 256 значений взависимости от оттенка красного?

Да. Каждая из трёх составляющих может принимать значения от 0 до 255. По коду ничего не скажу, т.к. боюсь соврать как в случае с оператором <<  smile 
PM MAIL ICQ Skype   Вверх
fen1ksss
Дата 14.9.2010, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вот эти значения (RowProcessed[i].rgbtRed << 16) + (RowProcessed[i].rgbtGreen << 8) + RowProcessed[i].rgbtBlue;
по какому принципу выбираются?
если картинка другого размера?

Это сообщение отредактировал(а) fen1ksss - 14.9.2010, 21:01
PM MAIL   Вверх
UniBomb
Дата 14.9.2010, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 1754
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 97



fen1ksss, выбираются по одному и тому же принципу. Вот смотри - картинка имеет глубину цвета 24 бита. Три состовляющие. Значит на каждую составляющую приходится по 8 бит или по одному байту. 24 бита - это три байта. Значит числовое значение цвета - это есть ни что иное как трёхбайтное целое число, где старший байт является красной составляющей, средний байт зелёной, а младший - соответсвенно синей.

user posted image


PM MAIL ICQ Skype   Вверх
fen1ksss
Дата 14.9.2010, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



UniBomb, понял, спасибо, теперь бы только с ошибкой разобраться

Добавлено через 12 минут и 47 секунд
Может дело в моем image? если просто в paint или другой программе создаю изображение Windows bmp оно ведь 24-битное?
PM MAIL   Вверх
Illusion Dolphin
Дата 15.9.2010, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 13
Всего: 63



Ошибка в строке 62 - I и J после цикла - RowProcessed выходит за пределы. 
Вообще не понимаю зачем надо BMP переводить в массив если это и есть массив smile 

Код

OriginalBitmap.PixelFormat := pf24Bit;
ProcessedBitmap.PixelFormat := pf24Bit;
ProcessedBitmap.Width := OriginalBitmap.Width;
ProcessedBitmap.Height:= OriginalBitmap.Height;
for j:=OriginalBitmap.Height-1 downto 0 do
begin
  RowOriginal:=pRGBArray(OriginalBitmap.Scanline[j]);
  RowProcessed:=pRGBArray(ProcessedBitmap.Scanline[j]);
  for i:=OriginalBitmap.Width-1 downto 0 do
  begin
    //Доступ к RGB-цветам отдельных пикселей должен осуществляться следующим образом:
    RowProcessed[i].rgbtRed:=255-RowOriginal[i].rgbtRed;
    RowProcessed[i].rgbtGreen:=255-RowOriginal[i].rgbtGreen;
    RowProcessed[i].rgbtBlue:=255-RowOriginal[i].rgbtBlue;
    Form1.Canvas.Pixels[i,j]:=RGB(RowProcessed[i].rgbtRed, RowProcessed[i].rgbtGreen, RowProcessed[i].rgbtBlue);
  end;
end;


Цитата

если просто в paint или другой программе создаю изображение Windows bmp оно ведь 24-битное

Не всегда.


--------------------
В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен.
Шифрование и организация фотографий - Photo Database 4.5
PM MAIL WWW ICQ   Вверх
fen1ksss
Дата 15.9.2010, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Illusion Dolphin @  15.9.2010,  17:35 Найти цитируемый пост)
Ошибка в строке 62 - I и J после цикла - RowProcessed выходит за пределы. 


что можно сделать? i,j описать как longint?

Вот такая ошибка
Process is not accessible
Thread Exit: Thread ID: 3852. Process Project1.exe (3536)

вот юнит с картинкой
http://www.megaupload.com/?d=XX55QNQD


Цитата(Illusion Dolphin @  15.9.2010,  17:35 Найти цитируемый пост)
Вообще не понимаю зачем надо BMP переводить в массив если это и есть массив

В итоге должна должна получиться программа : из видео сделать изображение-панораму.
в массив загонять нужно чтобы дальше сравнивать 2 изображения, находить общие пиксели и накладывать друг на друга

Это сообщение отредактировал(а) fen1ksss - 15.9.2010, 20:29
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

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

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

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

FAQ раздела лежит здесь!


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

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


 




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


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

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