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