Преобразование изображения из 32-хбитного в 24-хбитное
Модератор: Модераторы
Преобразование изображения из 32-хбитного в 24-хбитное
Добрый день.
Собственно перерыл весь инет в поисках ответа на этот вопрос: как преобразовать 32-хбитный TBitMap в 24-хбитный? Или Хотя бы как нарисовать его на TCanvas 24-хбитного TBitMap так, чтобы пиксели содержащие альфа канал нормально отрисовывались?
Собственно перерыл весь инет в поисках ответа на этот вопрос: как преобразовать 32-хбитный TBitMap в 24-хбитный? Или Хотя бы как нарисовать его на TCanvas 24-хбитного TBitMap так, чтобы пиксели содержащие альфа канал нормально отрисовывались?
Как вариант:
Или нужно что-то другое?
Код: Выделить всё
bmp24 := TBitmap.Create;
bmp24.PixelFormat := pf24bit;
bmp24.Width := bmp32.Width;
bmp24.Height := bmp32.Height;
bmp24.Canvas.Brush.Color := clWhite;// на белом фоне
bmp24.Canvas.Brush.Style := bsSolid;
bmp24.Canvas.FillRect(0,0,bmp24.Width,bmp24.Height);
bmp24.Canvas.Draw(0,0,bmp32);
Или нужно что-то другое?
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
iskander, скорее всего речь о цвете пикселей.
iskander, этот вариант не подходит, если исходное изображение содержит альфаканал. Полупрозрачные пиксели становятся черными.
Побайтно складывай цвета пикселей с цветом фона, получишь изображение состоящее из двух слоёв, как в графическом редакторе.
Demi писал(а): Полупрозрачные пиксели становятся черными.
???
Образец можно?
Demi писал(а):Образец:https://dl.dropbox.com/u/19158664/screen.jpg
Полагаю это результат, а исходник?
Код: Выделить всё
test1:=TLazIntfImage.Create(Bitmap.Width,Bitmap.Height);
test:= Bitmap.CreateIntfImage;
ImgFormatDescription.Init_BPP24_B8G8R8_BIO_TTB(Bitmap.Width,Bitmap.Height);
test1.DataDescription:=ImgFormatDescription;
test1.CopyPixels(test);
bmap:=TBitMap.Create;
bmap.PixelFormat:=pf24bit;
bmap.LoadFromIntfImage(test1);
if bmap.PixelFormat = pf24bit then
Form1.Caption:='24'; // it's work!!!! Form1.Caption=24
if bmap.PixelFormat = pf32bit then
Form1.Caption:='32'; Я имел в виду исходную картинку.
Полагая, что вам нужно её напечатать я и предложил самый простой вариант - нарисовать картинку на непрозрачном белом фоне. Это должно работать. Можно оформить в маленькую функцию:
Полагая, что вам нужно её напечатать я и предложил самый простой вариант - нарисовать картинку на непрозрачном белом фоне. Это должно работать. Можно оформить в маленькую функцию:
Код: Выделить всё
function ConvertTo24Bit(aValue: TBitmap;BackColor: TColor): TBitmap;
begin
Result := TBitmap.Create;
with Result do
if aValue.PixelFormat <> pf24bit then
begin
PixelFormat := pf24bit;
SetSize(aValue.Width,aValue.Height);
Canvas.FloodFill(0,0,BackColor,fsBorder);
Canvas.Draw(0,0,aValue);
end
else
Assign(AValue);
end;
