Преобразование изображения из 32-хбитного в 24-хбитное

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
Demi
незнакомец
Сообщения: 5
Зарегистрирован: 19.02.2013 10:43:41
Контактная информация:

Преобразование изображения из 32-хбитного в 24-хбитное

Сообщение Demi »

Добрый день.
Собственно перерыл весь инет в поисках ответа на этот вопрос: как преобразовать 32-хбитный TBitMap в 24-хбитный? Или Хотя бы как нарисовать его на TCanvas 24-хбитного TBitMap так, чтобы пиксели содержащие альфа канал нормально отрисовывались?
iskander
энтузиаст
Сообщения: 627
Зарегистрирован: 08.01.2012 18:43:34

Сообщение iskander »

Как вариант:

Код: Выделить всё

  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, скорее всего речь о цвете пикселей.
Demi
незнакомец
Сообщения: 5
Зарегистрирован: 19.02.2013 10:43:41
Контактная информация:

Сообщение Demi »

iskander, этот вариант не подходит, если исходное изображение содержит альфаканал. Полупрозрачные пиксели становятся черными.
Сквозняк
энтузиаст
Сообщения: 1159
Зарегистрирован: 29.06.2006 22:08:32

Сообщение Сквозняк »

Побайтно складывай цвета пикселей с цветом фона, получишь изображение состоящее из двух слоёв, как в графическом редакторе.
iskander
энтузиаст
Сообщения: 627
Зарегистрирован: 08.01.2012 18:43:34

Сообщение iskander »

Demi писал(а): Полупрозрачные пиксели становятся черными.

???
Образец можно?
iskander
энтузиаст
Сообщения: 627
Зарегистрирован: 08.01.2012 18:43:34

Сообщение iskander »

Demi писал(а):Образец:https://dl.dropbox.com/u/19158664/screen.jpg

Полагаю это результат, а исходник?
Demi
незнакомец
Сообщения: 5
Зарегистрирован: 19.02.2013 10:43:41
Контактная информация:

Сообщение Demi »

Код: Выделить всё

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';
iskander
энтузиаст
Сообщения: 627
Зарегистрирован: 08.01.2012 18:43:34

Сообщение iskander »

Я имел в виду исходную картинку. :wink:
Полагая, что вам нужно её напечатать я и предложил самый простой вариант - нарисовать картинку на непрозрачном белом фоне. Это должно работать. Можно оформить в маленькую функцию:

Код: Выделить всё

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;
Ответить