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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.12.2009, 07:47   #1
acid_bmstu
Пользователь
 
Регистрация: 01.12.2009
Сообщений: 10
По умолчанию Замена некоторых пикселей в изображении

Просидел всю ночь так и не смог разобраться, может кто может подсказать
Суть проблемы в следующем:
1. есть 2 изображения 1000*1000*24b jpeg надо определенные пиксели одного изображения заменить на соответствующие пиксели другого изображения
т е изначально на экран выводится первое изображение а при нажатии кнопки определенные пиксели меняются и на экране мы должны видеть новое изображение которое мы в дальнейшем сможем сохранить при нажатии другой кнопки
это надо реализовывать при помощи TImage или TPaintBox?
2. как проверить что пиксель определенного изображения является черным?

p.s. в делфи я не силен поэтому был бы очень признателен если кто нибудь дал бы развернутый ответ как это реализовать
acid_bmstu вне форума Ответить с цитированием
Старый 01.12.2009, 08:07   #2
SERG1980
Участник клуба
 
Аватар для SERG1980
 
Регистрация: 28.03.2007
Сообщений: 1,814
По умолчанию

Код:
procedure TForm1.Button1Click(Sender: TObject);
var i,j:integer;
begin
 for i:=0 to Image1.Width-1 do
  for j:=0 to Image1.Height-1 do
  if Image1.Canvas.Pixels[i,j]=$FFFFFF then Image1.Canvas.Pixels[i,j]:=clred;
end;
меняем чёрный на красный
пользуйтесь поиском такой вопрос уже был недавно.
Ну а как сохранить вы наверно знаете
SERG1980 вне форума Ответить с цитированием
Старый 01.12.2009, 11:19   #3
acid_bmstu
Пользователь
 
Регистрация: 01.12.2009
Сообщений: 10
По умолчанию

Я пробовал так делать но у меня выдает ошибку
Смог добить нужного результата только так
Но тут у меня возникло сразу несколько проблем
1. картинки приходится брать 500 на 500 пикселей иначе при выводе изображение выходит за пределы экрана (т е я хотел чтоб программа работала с изображениями побольше)
2. проходит какое то время пока он выводит новое изображение, это он так долго читает картинки или это время уходит на выполнение цикла?
3. может можно это как то по другому реализовать?
4. я пробовал просто сохранять изображение через BT.SaveToFile(); чтоб потом просто открыть в TImage но программа выдает ошибку

Код:
var
  Form1: TForm1;
  BT,BT1,BT2:TBitMap;
  Color:TColor;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var i,j:integer;
     JP,JP1,JP2: TJPEGImage;
     c:TColor;
begin
 Form1.windowState:= wsMaximized;
 form1.FormStyle :=fsstayOnTop;
 JP:=TJPEGImage.Create;
 JP.LoadFromFile('D:\PK-701.jpg');
 BT:=TBitMap.Create;
 BT.Assign(JP);
 // вывод первоначального изображения
 Canvas.Draw(0, 0, BT);

 JP1:=TJPEGImage.Create;
 JP1.LoadFromFile('D:\PK-701 копия.jpg');
 BT1:=TBitMap.Create;
 BT1.Assign(JP1);

 JP2:=TJPEGImage.Create;
 JP2.LoadFromFile('D:\Rosa_Tea_Normal.jpg');
 BT2:=TBitMap.Create;
 BT2.Assign(JP2);
  for i:=0 to BT.Width do
  for j:=0 to BT.Height do
  if BT1.Canvas.Pixels[i,j]<>$ffffff then BT.Canvas.Pixels[i,j]:=BT2.canvas.Pixels[i,j];
  // вывод измененного изображения
  Canvas.Draw(0, 0, BT);
end;

Последний раз редактировалось Stilet; 01.12.2009 в 16:04.
acid_bmstu вне форума Ответить с цитированием
Старый 01.12.2009, 16:00   #4
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
Сообщение от SERG1980 Посмотреть сообщение
Код:
...
  if Image1.Canvas.Pixels[i,j]=$FFFFFF then Image1.Canvas.Pixels[i,j]:=clred;
...
меняем чёрный на красный
Не-е-ет... Это вы белый на красный меняете
Код черного - одни нолики...
mihali4 вне форума Ответить с цитированием
Старый 02.12.2009, 08:53   #5
SERG1980
Участник клуба
 
Аватар для SERG1980
 
Регистрация: 28.03.2007
Сообщений: 1,814
По умолчанию

Цитата:
Сообщение от mihali4 Посмотреть сообщение
Не-е-ет... Это вы белый на красный меняете
Код черного - одни нолики...
Да ступил
SERG1980 вне форума Ответить с цитированием
Старый 02.12.2009, 10:30   #6
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Цитата:
1. картинки приходится брать 500 на 500 пикселей иначе при выводе изображение выходит за пределы экрана (т е я хотел чтоб программа работала с изображениями побольше)
PaintBox в ScrollBox. На канву PaintBox'a выводишь изображение.

Цитата:
2. проходит какое то время пока он выводит новое изображение, это он так долго читает картинки или это время уходит на выполнение цикла?
Нет, картинки грузятся быстро. А вот доступ к отдельным пикселям происходит довольно медленно. Ускорить можно читая битмап строками, с помощью ScanLine.

Цитата:
3. может можно это как то по другому реализовать?
Можно, ScanLine.

Цитата:
4. я пробовал просто сохранять изображение через BT.SaveToFile(); чтоб потом просто открыть в TImage но программа выдает ошибку
Ошибки быть не должно, если объект BT на данный момент существует. В скобках нужно имя файла указать, с расширением bmp. Когда и какую ошибку выдает программа?
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 03.12.2009, 09:34   #7
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

ошибка возможна, если изображение BT2 имеет меньшие размеры, чем BT1. Тогда получается выход за пределы диапазона массива в цикле. А чтобы картинка на всю форму влезала, можно ее сжать по размерам (Canvas.StretchDraw)
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Старый 04.12.2009, 17:03   #8
BattleNick
Новичок
Джуниор
 
Регистрация: 10.11.2009
Сообщений: 2
По умолчанию

Господа, всем доброго времени суток! У меня проблема немного похожа, но в моем случае мне нужно узнать количество черных пикселей и количество белых, причем желательно с использованием scanline. Если кто может - очень прошу помоч!
BattleNick вне форума Ответить с цитированием
Старый 07.12.2009, 10:24   #9
acid_bmstu
Пользователь
 
Регистрация: 01.12.2009
Сообщений: 10
По умолчанию

Цитата:
Сообщение от 3D Hunter Посмотреть сообщение
ошибка возможна, если изображение BT2 имеет меньшие размеры, чем BT1. Тогда получается выход за пределы диапазона массива в цикле. А чтобы картинка на всю форму влезала, можно ее сжать по размерам (Canvas.StretchDraw)
Нет размеры картинок идентичные
Ошибка возникала когда я сохранял файл с расширением .jpg а потом пытался тут же его открыть в TImage, чтобы изображение не выходило за пределы рабочей зоны, потом просто задал сохранение с разрешением .bmp и ошибка исчезла
acid_bmstu вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопросы о некоторых задачах k1r1ch Паскаль, Turbo Pascal, PascalABC.NET 3 20.10.2009 13:24
Изменение пикселей Antitime Мультимедиа в Delphi 2 27.08.2009 17:37
Замена кода программы с Delhi5 на Delhi7 либо замена базы данных с Acessa на MySQL DorianLeroy Фриланс 8 18.02.2009 18:52
Таблица пикселей bl0w Мультимедиа в Delphi 1 19.01.2009 00:32
Извлечение RGB пикселей из bmp-файла St0ne-c0ld Фриланс 7 16.10.2008 18:27