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