![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
В общем есть картинка bmp формата, нужно разбить эту картинку на RGB и загнать в массив (скорее всего 3 мерный где каждый элемент это r,g,b соответсвенно) для дальнейшей работы с изображением через массив.
Дело в том что как работать с черно-белым понимаю, а как цветное на RGB разбить немного не понимаю, подскажите |
|
#2
|
||||
|
||||
|
к сожалению не могу представить бмп в виде 3-х мерного массива. а вот pixels[x,y] вполне даже
|
|
#3
|
|||
|
|||
|
мне нужен именно rgb для дальнейшей работы
|
|
#4
|
|||
|
|||
|
структура BMP http://ru.wikipedia.org/wiki/BMP
bfOffBits - смещение до массива с изображением. Размер массива:= рbfSize - bfOffBits Если картинка 32 битная, то каждая ячейка массива картинки будет равна BGRZ (Z используется редко) каждое значение размером в 1 байт (итого 4). |
|
#5
|
|||
|
|||
|
Берем пример использования ScanLine и внимательно изучаем.
|
|
#6
|
|||
|
|||
|
Код:
CONST PixelCountMax = 32768; TYPE pRGBArray = ^TRGBArray; TRGBArray = ARRAY[0..PixelCountMax-1] OF TRGBTriple; ... var Form1: TForm1; OriginalBitmap:TBitmap; ProcessedBitmap:TBitmap; i,j:integer; RowOriginal:pRGBArray; RowProcessed:pRGBArray; Код:
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
RowProcessed[i].rgbtRed:=RowOriginal[i].rgbtRed;
RowProcessed[i].rgbtGreen:=RowOriginal[i].rgbtGreen;
RowProcessed[i].rgbtBlue:=RowOriginal[i].rgbtBlue;
end;
end;
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, программа выдает ошибку, подскажите Последний раз редактировалось fen1ks, 14.09.2010 в 22:22. |
|
#7
|
|||
|
|||
|
На какой строке и какую (точно) ошибку?
Или ты думаешь, что здесь телепаты сидят? |
|
#8
|
|||
|
|||
|
Проект запускается, при нажатии Button1 вылазиет сообщение
http://ipicture.ru/uploads/100914/U6eT6L4Wzt.jpg Access violation at address 00424BCC in module 'Project1.exe'. Read of address 00000028. http://ipicture.ru/uploads/100914/5sNd55jVIM.jpg |
|
#9
|
|||
|
|||
|
Ну, вообще, такая ошибка характерна для обращения к неинициализированному учаску памяти. Или заблокированному...
Что-то я не вижу в твоем коде создание ProcessedBitmap и выставления его размеров... |
|
#10
|
|||
|
|||
|
Цитата:
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
OriginalBitmap.LoadFromFile('0003.bmp');
ProcessedBitmap.width:=800;
ProcessedBitmap.height:=600;
createbmp;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
OriginalBitmap:=TBitmap.Create;
ProcessedBitmap:=TBitmap.Create;
end;если вот так, то по нажатию на кнопку ничего не происходит и выдает Process is not accessible Thread Exit: Thread ID: 3852. Process Project1.exe (3536) вот юнит с картинкой http://www.megaupload.com/?d=XX55QNQD Последний раз редактировалось fen1ks, 15.09.2010 в 13:58. |