Глубина цвета в bmp или image

Форум для изучающих FPC и их учителей.

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

Ответить
rustem
незнакомец
Сообщения: 9
Зарегистрирован: 16.04.2012 09:00:25

Глубина цвета в bmp или image

Сообщение rustem »

Вообщем есть такой код

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

procedure TfrmMain.SpeedButton2Click(Sender: TObject);
var
  bmp: TBitmap;
begin
  bmp:= TBitmap.Create;
  bmp.PixelFormat:= pf8bit;
  bmp.Assign(imgSmall.Picture.Bitmap);
  bmp.SaveToFile('345.bmp');
  bmp.Free;
end; 

Только почему он не работает??? после сохранения все равно картинка 24bit?
sts
энтузиаст
Сообщения: 519
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Сообщение sts »

надо помнять местами?
bmp.PixelFormat:= pf8bit;
и
bmp.Assign(imgSmall.Picture.Bitmap);
rustem
незнакомец
Сообщения: 9
Зарегистрирован: 16.04.2012 09:00:25

Сообщение rustem »

Это первое что я попробовал. Тогда сохраняется полностью черная картинка, а глубина все равно 24bit :(
Ism
энтузиаст
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Сообщение Ism »

Это давний глюк с черной картинкой, кажется помогало поставить через pixels точку на картинке и тогда она сохранялась, почему, неизвестно.
rustem
незнакомец
Сообщения: 9
Зарегистрирован: 16.04.2012 09:00:25

Сообщение rustem »

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

procedure TfrmMain.SpeedButton2Click(Sender: TObject);
var
  bmp: TBitmap;
begin
  bmp:= TBitmap.Create;
  bmp.Assign(imgSmall.Picture.Bitmap);
  bmp.PixelFormat:= pf8bit;
  bmp.Canvas.Pixels[0,0]:=clWhite;
  bmp.SaveToFile('345.bmp');
  bmp.Free;
end;   

Теперь сохраняется черная картинка с белой точкой слева сверху.
Научите, может как нибудь по-другому можно сделать?
Ism
энтузиаст
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Сообщение Ism »

Если загрузить картинку в bmp и сохранить , то все будет работать
Видимо imgSmall.Picture.Bitmap в другом формате

TBitmap понимает только один формат bmp

Видимо надо пробовать через LoadFromStream

Добавлено спустя 5 минут 7 секунд:
Можно загрузить в TImage и присвоить Assign(Image1.Picture)
rustem
незнакомец
Сообщения: 9
Зарегистрирован: 16.04.2012 09:00:25

Сообщение rustem »

Ism писал(а):Можно загрузить в TImage и присвоить Assign(Image1.Picture)

Сохраняется черная картинка. а под линем так еще и ошибку выдает.
Ism писал(а):Видимо imgSmall.Picture.Bitmap в другом формате

Как это понять? Смотрим в код

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

property Bitmap: TBitmap read GetBitmap write SetBitmap; 

Ism писал(а):LoadFromStream

Этой процедурой нужно загружать в TImage или в bmp?
Ism писал(а):Если загрузить картинку в bmp и сохранить , то все будет работать

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

procedure TfrmMain.SpeedButton2Click(Sender: TObject);
var
  bmp: TBitmap;
begin
  bmp:= TBitmap.Create;
  bmp.LoadFromFile('123.bmp');
  bmp.PixelFormat:= pf8bit;
  bmp.SaveToFile('345.bmp');
  bmp.Free;
end;     

Получается аналогичная картинка 24bit и такого же размера.
Может у меня лазарус неправильный?
Ism
энтузиаст
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Сообщение Ism »

Неизвестно , если вы загрузите jpg и попробуете сохранить в bmp , то получите черную картинку. Видимо внутри есть разные типы рисунков , даже если они все отображаются в TImage. Так и неизвестно , это глюк или норма.

Поэтому надо сохранить поток TBitmap и детально разобрать в чем подвох. Но это задача разработчиков

Как вариант попробуйте BGRABitmap http://wiki.freepascal.org/BGRABitmap
rustem
незнакомец
Сообщения: 9
Зарегистрирован: 16.04.2012 09:00:25

Сообщение rustem »

Спасибо за подсказку буду пробовать.
Ответить