|
Вопрос # 1 434/ вопрос открыт / |
|
Приветствую, уважаемые эксперты!
На форме присутствует компонент Image1. В него я загружаю картинку формата bmp и организую приведенный ниже цикл
Но если загрузить картинку, например, формата jpeg, то такой способ как говорится не катит(т. к. Image1.Canvas)
Как организовать подобный цикл для формата jpeg?
Приложение: Переключить в обычный режим- For i:=1 To Image1.Picture.Width do
- begin
- For j:=1 To Image1.Picture.Height do
- begin
- with Image1.Canvas do
- 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 - это идеологически неверный способ. Если нужно просто посчитать кол-во пикселей какого то цвета или что то подобное - то лучше работать с изображением в памяти.
Смотрите приложение, там есть код.
Приложение: Переключить в обычный режим- procedure TForm2.Button1Click(Sender: TObject);
- var bmp:TBitmap;
- begin
- bmp:=TBitmap.Create;
- try
- bmp.Assign(Image1.Picture.Graphic);
-
-
- bmp.SaveToFile('C:x.bmp');
-
- if bmp.Canvas.Pixels[1,1] then
- finally
-
- end;
- 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]...
Не предлагать!!!
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|