| 
| 
 | Вопрос # 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]...
 
 Не предлагать!!!
 |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |