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

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

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.02.2009, 15:20   #1
Манжосов Денис :)
Участник клуба
 
Регистрация: 29.01.2008
Сообщений: 1,039
По умолчанию Ошибка в отражении изображения

У меня проблема: я не могу понять в чём ошибка.
Есть такой код:
Код:
procedure TMainForm.InvertLeftToRight;
var
  i,j: integer;
  One: TColor;
begin
  for i:=0 to MainBmp.Width div 2 do
   for j:=0 to MainBmp.Height do
   begin
      One := MainBmp.Canvas.Pixels[i,j];
      MainBmp.Canvas.Pixels[i,j] :=
      MainBmp.Canvas.Pixels[MainBmp.Width - i, j];
      MainBmp.Canvas.Pixels[MainBmp.Width - i, j] := One;
   end;
  Repaint;
end;
Этот код отражает изображение слева направо и наоборот. Он работает.
А этот код:
Код:
procedure TMainForm.InvertUpToDown;
var
  i,j: integer;
  One: TColor;
begin
  for i:=0 to MainBmp.Width div 2 do
   for j:=0 to MainBmp.Height do
   begin
      One := MainBmp.Canvas.Pixels[i,j];
      MainBmp.Canvas.Pixels[i,j] :=
      MainBmp.Canvas.Pixels[MainBmp.Width - i, MainBmp.Height - j];
      MainBmp.Canvas.Pixels[MainBmp.Width - i, MainBmp.Height - j] := One;
   end;
  Repaint;
end;
отражает изображение сверху вниз и наоборот.
Он работает почти правильно: остаётся неотражённая линия посередине изображения.
Чтобы было удобней, я прикрепил проект.
Спасибо.
P.S. Изображения в архиве нет, потому, по возможности, вставьте в папку с проектом любой BMP файл и переименуйте в 'test.bmp'
Вложения
Тип файла: rar Pic.rar (1.1 Кб, 10 просмотров)
Манжосов Денис :) вне форума Ответить с цитированием
Старый 21.02.2009, 15:46   #2
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Код:
procedure TMainForm.InvertUpToDown;
var
  i,j: integer;
  One: TColor;
begin
  for i:=0 to MainBmp.Width do
   for j:=0 to MainBmp.Height div 2 do
   begin
      One := MainBmp.Canvas.Pixels[i,j];
      MainBmp.Canvas.Pixels[i,j] :=
      MainBmp.Canvas.Pixels[i, MainBmp.Height - j];
      MainBmp.Canvas.Pixels[i, MainBmp.Height - j] := One;
   end;
  Repaint;
end;
mihali4 вне форума Ответить с цитированием
Старый 21.02.2009, 16:06   #3
Манжосов Денис :)
Участник клуба
 
Регистрация: 29.01.2008
Сообщений: 1,039
По умолчанию

Спасибо большое. Как-то даже не заметил такой несложной ошибки.
Манжосов Денис :) вне форума Ответить с цитированием
Старый 22.02.2009, 10:14   #4
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Денис, а что будет если ширина или высота нечетные?
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 вне форума Ответить с цитированием
Старый 22.02.2009, 13:31   #5
Манжосов Денис :)
Участник клуба
 
Регистрация: 29.01.2008
Сообщений: 1,039
По умолчанию

Код:
 for j:=0 to MainBmp.Height div 2 do
Прибавить единицу: MainBmp.Height div 2 + 1.
Наверное так.
Манжосов Денис :) вне форума Ответить с цитированием
Старый 22.02.2009, 13:35   #6
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Зачем? Среднюю линию (она и дает нечетность) менять ни с какой другой не нужно (или саму с собой ).
Так что все в вашем коде нормально.
mihali4 вне форума Ответить с цитированием
Старый 22.02.2009, 23:03   #7
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
Лампочка

Цитата:
Сообщение от mihali4 Посмотреть сообщение
Зачем? Среднюю линию (она и дает нечетность) менять ни с какой другой не нужно (или саму с собой ).
Так что все в вашем коде нормально.
Действительно, я и сам сразу не сообразил

Еще можно сделать по горизонтали обмен строками целиком через ScanLine. Иногда так удобнее, а бывает по другому и не подходит. Строка вынимается из битмапа так:
Код:
var p: PByteArray;
p:=bmp.ScanLine[n];
В ней содержатся RGB составляющие всех пикселей по очереди (если 24 битный битмап).
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 вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамические изображения. Sectron Паскаль, Turbo Pascal, PascalABC.NET 3 15.04.2014 14:16
Ошибка при загрузки изображения Volkogriz Общие вопросы Delphi 13 13.01.2009 01:51
Чтение изображения из базы данных, Вместо изображения - "System.Byte[]" ruelCrow Общие вопросы .NET 3 10.07.2008 23:29
масштабирование изображения Alex_Pro Общие вопросы .NET 0 25.05.2008 09:09
Изображения в БД alikon1 БД в Delphi 3 08.10.2007 13:13