Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник
Коллекция курьезных вопросов из форумов
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.org

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »

Сохранить BMP 32 BPP с прозрачностью


Андрей71717   (14.05.22 08:43

Всем привет!

Есть TBitmap 32-битный, нужно его сохранить с альфой.
Желательно в PNG.

Пробовал сохранять так, прозрачность теряется:



procedure SaveImageToPNG(Bitmap: TBitmap; const FileName: String);
var
 PngImage: TPngImage;
begin
 PngImage := TPngImage.Create;
 try
   PngImage.Assign(Bitmap);

   PngImage.SaveToFile(FileName);
 finally
   FreeAndNil(PngImage);
 end;
end;


Пробовал так, но вылетает с ошибкой "не правильных хидер":


type
 PRGBQuadArray   = ^TRGBQuadArray;
 TRGBQuadArray   =  array [0..(MAXINT div SizeOf(TRGBQuad))   - 1] of TRGBQuad;
 PRGBTripleArray = ^TRGBTripleArray;
 TRGBTripleArray =  array [0..(MAXINT div SizeOf(TRGBTriple)) - 1] of TRGBTriple;

function BitmapToPNG(const Bitmap: TBitmap): TPNGImage;
var
 PNGImage:      TPNGImage;
 X, Y:          LongInt;
 ScanLine:      PRGBQuadArray;
 ScanLineColor: PRGBTripleArray;
 ScanLineAlpha: PByteArray;
begin
 PNGImage:= TPNGImage.Create();

 PNGImage.Resize(Bitmap.Width, Bitmap.Height);

 for Y := 0 to PNGImage.Height - 1 do
 begin
   ScanLine      := Bitmap.ScanLine[Y];
   ScanLineColor := PNGImage.ScanLine[Y];
   ScanLineAlpha := PNGImage.AlphaScanLine[Y];

   for X := 0 to PNGImage.Width - 1 do
   begin
     ScanLineColor[X].rgbtRed   := ScanLine[X].rgbRed;
     ScanLineColor[X].rgbtGreen := ScanLine[X].rgbGreen;
     ScanLineColor[X].rgbtBlue  := ScanLine[X].rgbBlue;
     ScanLineAlpha[X]           := ScanLine[X].rgbReserved;

   end;
 end;

 Result := PNGImage;
end;

procedure SaveImageToPNG_Alpha(Bitmap: TBitmap; const FileName: String);
var
 PngImage: TPngImage;
begin
 PngImage:= BitmapToPNG(Bitmap);
 try
   PngImage.SaveToFile(FileName);
 finally
   FreeAndNil(PngImage);
 end;
end;


Как решить эту задачу?


Rouse_ ©   (14.05.22 10:44[1]

CreateAlpha сначала сделай у PNG, а то у тебя альфаканал обнилен.


Андрей71717   (14.05.22 18:50[2]

Вернее изображение создавать так:


 PNGImage := TPNGImage.CreateBlank(COLOR_RGBALPHA, 8, Bitmap.Width, Bitmap.Height);


версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо