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

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

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

Delphi.int.ru Expert

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

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

#   

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


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

Подробнее »



Вопрос # 1 362

/ вопрос открыт /

Здравствуйте, уважаемые эксперты!
Есть два элемента TImage:
Image1 – картинка фон,
Image2 – расположена ровно над Image1 и какие-то части Image2 полностью прозрачны.
Подскажите, пожалуйста, как можно сохранить полученное изображение из наложенного Image2 на Image1 с заданными параметрами высоты и ширины изображения в пикселях в формат jpg?

Наташа Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задала: Наташа (статус: Посетитель)
Вопрос отправлен: 21 февраля 2008, 14:15
Состояние вопроса: открыт, ответов: 1.

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

Здравствуйте, Наташа!
Если посмотреть на задачу с другой стороны, то она очень просто решается.
Пусть Image1 и Image2 наши изображения, а Image 3 - результат

var i, j:integer;
begin
for i := image1.width -1 do
for j := image1.height - 1 do
  if image2.canvas.pixels[i,j] = Image2.canvas.pixels[0,0] then //Именно этот пиксель берётся как цвет для прозрачного
    image3.canvas.pixels[i,j] := image1.canvas.pixels[i,j]
  else
    image3.canvas.pixels[i,j] := image2.canvas.pixels[i,j]
end;
В реальном коде я конечно использовал бы TBitmap и строил бы изображение в памяти, но это никак не влияет на понимание алгоритма.
Что бы сохранить в JPEG нужно всего лишь пару строк
uses jpeg;
procedure TForm1.Button2Click(Sender: TObject);
var
  jpg: TJpegImage;
begin
  {создаем экземпляр объекта}
  jpg := TJpegImage.Create;
  {присваиваем ему изображение}
  jpg.Assign(image1.picture.graphic);
  {устанавливаем степень сжатия (качество) 1..100}
  jpg.CompressionQuality := TrackBar1.Position;
  {если установлен флаг "Оттенки серого", то пусть картинка будет серой:)}
  jpg.Grayscale := checkbox1.Checked;
  {Упаковываем графику}
  jpg.Compress;
  {и сохраняем ее куда вам захочется}
  jpg.SaveToFile('D:\first.jpg');
  {уничтожаем экземпляр объекта}
  jpg.free;
end;

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

Комментарий к оценке: Огромное спасибо.
Помещение результата в Image3 выдает ошибку: «Can only modify an image if it contains a bitmap». Вы уж меня, извините, пожалуйста. Я не совсем корректно задала вопрос. В Image1 картинка jpg, а в Image2 картинка png. И поэтому где-то полностью прозрачно, а где-то частично. Если можно, подскажите, пожалуйста.

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

Всего сообщений: 2; последнее сообщение — 22 февраля 2008, 21:43; участников в обсуждении: 2.
Наташа

Наташа (статус: Посетитель), 22 февраля 2008, 07:27 [#1]:

Огромное спасибо.
Помещение результата в Image3 выдает ошибку: «Can only modify an image if it contains a bitmap». Вы уж меня, извините, пожалуйста. Я не совсем корректно задала вопрос. В Image1 картинка jpg, а в Image2 картинка png. И поэтому где-то полностью прозрачно, а где-то частично. Если можно, подскажите, пожалуйста.
Вадим К

Вадим К (статус: Академик), 22 февраля 2008, 21:43 [#2]:

Данный алгоритм будет корректно работать только с bmp изображениями. Иначе нельзя. JPEG и PNG - это форматы сжатия, и что бы преобразовать, надо вначале расжать.
Есть конечно ещё один вариант - пережимать в свой формат, но что на данном этапе для вас это будет неподёмная задача.
Но с PNG отдельная история - его нужно уметь правильно отрисовать. Поэтому можно пойти немного другим способом - создать битмап, отрисовать на нем первую картинку, потом вторую. Для JPEG точно Image.canvas.Draw(bmp, 0, 0); сработает (где bmp :TBitmap). А вот что используете для PNG - я не знаю, но может там тоже есть подобный метод.
Галочка "подтверждения прочтения" - вселенское зло.

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

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 16:49
Выполнено за 0.03 сек.