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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.09.2012, 17:51   #1
Рустам
Форумчанин
 
Регистрация: 04.07.2007
Сообщений: 260
По умолчанию Преобразование рисунка в массив

Здравствуйте форумчане!
Задача для DELPHI 7 следующая:
Есть изображение в градациях серого...
Необходимо поместить его в двумерный массив типа
IMG[x,y] : INTEGER;

где Х - ширина изображения, Y - высота, а IMG - Оттенок (от 0 до 255);

вот такая вот задачка...
Хорошо не там, где нас нет, а там, где нас еще небыло!!!
Рустам вне форума Ответить с цитированием
Старый 07.09.2012, 18:43   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А зачем? Рисунок и так после загрузки представляет из себя массив.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 07.09.2012, 18:45   #3
Рустам
Форумчанин
 
Регистрация: 04.07.2007
Сообщений: 260
По умолчанию

думаю надо делать примерно так:

Код:
//...
var IMG: array of array of integer; // - делаем динамич. массив
var IMAGE : TIMAGE;
begin
IMAGE.Picture.loadfromfile('имя файла с изображением');
setlength(IMG, Image.picture.width, Image.picture.height);
for i:=0 to Image.picture.width do begin
  for j:=0 to Image.picture.height do begin
    IMG[i,j]:=strtoint(IMAGE.Canvas.pixels[i,j]);
  end;
end;
хммм....
я вообще в ту сторону двигаюсь....

только вот я получу непонятно что вместо оттенка в десятичном виде от 0-255...
Хорошо не там, где нас нет, а там, где нас еще небыло!!!

Последний раз редактировалось Stilet; 07.09.2012 в 20:32.
Рустам вне форума Ответить с цитированием
Старый 07.09.2012, 19:40   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,341
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А зачем? Рисунок и так после загрузки представляет из себя массив.
Это ответ, который является правильным. Мы конечно не знаем, какие "тараканы в голове" у вас, так что...
Код:
IMG[i,j]:=IMAGE.Canvas.pixels[i,j] and $FF;//мог напутать с синтаксисом
Идея такова: т.к. оттенки серого, то в каждом байте цвета записано одно и тоже значение, осталось только отсечь по маске.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 07.09.2012, 19:43   #5
Zer0
Форумчанин
 
Аватар для Zer0
 
Регистрация: 13.12.2007
Сообщений: 788
По умолчанию

IMAGE.Canvas.pixels[i,j] - тут у вас hex представление цвета пикселя, например
3f3f3f (если там действительно градации серого)
По сути - вам нужен отсюда только один байт, так что смело берите остаток этого цвета от деления на 256 - получите желаемое
благодарность - сюда (не забываем писать от кого)
Zer0 вне форума Ответить с цитированием
Старый 07.09.2012, 19:54   #6
Рустам
Форумчанин
 
Регистрация: 04.07.2007
Сообщений: 260
По умолчанию

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

примерно так:

for i:=0 to IMAGE.PICTURE.WIDTH do begin
for j:=1 to IMAGE.PICTURE.HEIGHT do begin
[оттенок] : = round(strtoint(IMAGE.CANVAS.PIXELS[i,j])/256);
end;
end;

ссори накосячил:
не IMAGE.CANVAS.PIXELS[i,j])/256, а
[оттенок] : = strtoint(IMAGE.CANVAS.PIXELS[i,j]) mod 256;

попробую теперь ъто дело в Delphi отладить....
Хорошо не там, где нас нет, а там, где нас еще небыло!!!

Последний раз редактировалось Stilet; 07.09.2012 в 20:36.
Рустам вне форума Ответить с цитированием
Старый 07.09.2012, 20:06   #7
Zer0
Форумчанин
 
Аватар для Zer0
 
Регистрация: 13.12.2007
Сообщений: 788
По умолчанию

честно говоря не понимаю зачем использовать StrToInt, там и так целое число
TColor = -$7FFFFFFF-1..$7FFFFFFF;
благодарность - сюда (не забываем писать от кого)
Zer0 вне форума Ответить с цитированием
Старый 07.09.2012, 20:08   #8
Рустам
Форумчанин
 
Регистрация: 04.07.2007
Сообщений: 260
По умолчанию

хммм... шчя усё проверим...

и правда... видимо Delphi сама переводит в СС делителя... - нашим легче!!!
Код:
for i:=0 to IMAGE.PICTURE.WIDTH do begin
 for j:=1 to IMAGE.PICTURE.HEIGHT do begin
 [оттенок: integer] : = IMAGE.CANVAS.PIXELS[i,j]) mod 256;
 end;
 end;
Всё получилося! Спасибки Ребятушки... :-)
Хорошо не там, где нас нет, а там, где нас еще небыло!!!

Последний раз редактировалось Stilet; 07.09.2012 в 20:40.
Рустам вне форума Ответить с цитированием
Старый 07.09.2012, 21:53   #9
Zer0
Форумчанин
 
Аватар для Zer0
 
Регистрация: 13.12.2007
Сообщений: 788
По умолчанию

Ну тут дело даже не в переводе. TColor - суть целое число, просто в модулях границы обозначены в HEX представлении
Даже в своем коде можно переменным целочисленным присваивать hex значения, например
Код:
var a:byte;
a:=$A0;
благодарность - сюда (не забываем писать от кого)
Zer0 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Преобразование числа в массив (Delphi) Начинающий програм Помощь студентам 4 27.01.2012 20:02
Преобразование 3-х мерного в 2-х мерный массив. Corvette Общие вопросы C/C++ 2 28.08.2011 21:10
Преобразование текстового файла в массив DarkSwan Общие вопросы C/C++ 2 14.10.2010 17:01
Массив и его преобразование svitlik Паскаль, Turbo Pascal, PascalABC.NET 0 19.06.2009 14:56