Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

DNK
I. DNK
Баллы: 5

Подробнее »



Вопрос # 1 434

Раздел: Delphi » Прочее
/ вопрос открыт /

Приветствую, уважаемые эксперты!
На форме присутствует компонент Image1. В него я загружаю картинку формата bmp и организую приведенный ниже цикл

Но если загрузить картинку, например, формата jpeg, то такой способ как говорится не катит(т. к. Image1.Canvas)

Как организовать подобный цикл для формата jpeg?

Приложение:
  1. For i:=1 To Image1.Picture.Width do
  2. begin
  3. For j:=1 To Image1.Picture.Height do
  4. begin
  5. with Image1.Canvas do
  6. if pixels[i,j]...


Полушин Сергей Анатольевич Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Полушин Сергей Анатольевич (статус: Посетитель)
Вопрос отправлен: 19 марта 2008, 20:13
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: Вадим К

Здравствуйте, Полушин Сергей Анатольевич!
Для начала обясню, почему предложенный способ работает с bmp, но не работает с jpg. Всё предельно просто. Надеюсь, вы знаете, что bmp - это просто массив цветов всех точек плюс размеры плюс некоторая дополнительная информация. Изменяя один пиксель, достаточно просто найти положение его в массиве и заменить. На соседние пиксели это не влияет.
JPG формат более сложен. (Читаем здесь http://ru.wikipedia.org/wiki/JPEG на русском в двух словах, а http://en.wikipedia.org/wiki/JPEG на английском, но зато есть формулы, выкладки) Здесь, для изменения одного пикселя пришлось бы распаковать изображение (например в bmp), изменить пиксель и сжать снова. И если распаковка достаточно быстное действие, то сжатие - нет.
Учитывая всё вышесказаное, правильный вариант такой - распаковать и потом работать с этим изображением.
Но я вижу, что вы используете Image - это идеологически неверный способ. Если нужно просто посчитать кол-во пикселей какого то цвета или что то подобное - то лучше работать с изображением в памяти.
Смотрите приложение, там есть код.

Приложение:
  1. procedure TForm2.Button1Click(Sender: TObject);
  2. var bmp:TBitmap;
  3. begin
  4. bmp:=TBitmap.Create;
  5. try
  6. bmp.Assign(Image1.Picture.Graphic);
  7.  
  8.  
  9. bmp.SaveToFile('C:x.bmp');
  10.  
  11. if bmp.Canvas.Pixels[1,1] then
  12. finally
  13.  
  14. end;
  15. end;


Ответ отправил: Вадим К (статус: Академик)
Время отправки: 19 марта 2008, 22:24
Оценка за ответ: 5

Комментарий к оценке: Как раз то, что мне нужно! Спасибо. 6 баллов

Мини-форум вопроса

Всего сообщений: 1; последнее сообщение — 19 марта 2008, 20:14; участников в обсуждении: 1.
Полушин Сергей Анатольевич

Полушин Сергей Анатольевич (статус: Посетитель), 19 марта 2008, 20:14 [#1]:

Цикл
For i:=1 To Image1.Width do
begin
For j:=1 To Image1.Height do
begin
with Canvas do
if pixels[i+Image1.Left,j+Image1.Top]...

Не предлагать!!!

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 23 июля 2017, 05:46
Выполнено за 0.03 сек.
Рейтинг@Mail.ru