Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Программирование под Windows > Delphi
Перезагрузить страницу Формат BMP как изменять размер
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
Shturmovik Shturmovik вне форума
Member
 
Сообщений: 106
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 27.11.2005
По умолчанию Формат BMP как изменять размер - 04.12.2006, 18:05

У формата BMP есть такие параметры - разрешения по горизонтали и вертикали. Допустим, у меня есть файл BMP разрешения 71 точек/дюйм. Как изменить его на 96 точек на дюйм?
Ответить с цитированием
  (#2 (permalink)) Старый
PerfectStranger PerfectStranger вне форума
Member
 
Сообщений: 240
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 19.05.2006
По умолчанию 05.12.2006, 11:16

Могу ошибаться, но по-моему у BMP понятия именно разрешения (пикели на дюйм) нет - есть только размеры (просто пиксели, без "на дюйм" :-) )...
Ответить с цитированием
  (#3 (permalink)) Старый
ZonD ZonD вне форума
Member
 
Сообщений: 205
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 07.04.2004
По умолчанию 05.12.2006, 15:42

Ответ на вскидку:
Найди описание структуры заголовка BitMap, также размер в байтах этого заголовка.
Далее создаешь эту структуру, считываешь туда н-ое количество байт и далее изменяешь размер на сколько тебе надо и пишешь в файл новый заголовок.
так как с БМП давно не работал могу привести пример работы с wave файлом:

объявляем структуру wave в твоем случае bmp

Код:
  TWaveHeader = record
     ChunkID      :  array[0..3] of char;
     ChunkSise    :  integer;
     Format       :  array[0..3] of char;
     SubChunk1ID  :  array[0..3] of char;
     SubChunk1Size:  integer;
     AudioFormat  :  word;
     NumChannels  :  word;
     SampleRate   :  integer;
     ByteRate     :  integer;
     BlockAlign   :  word;
     BitsPerSample:  word;        
     SubChunk2ID  :  array[0..3] of char;
     SubChunk2Size:  integer;    // == NumSamples * NumChannels * BitsPerSample/8
  end;

const
  SizeHeader = 44;

var
    Header        : TWaveHeader;
и далее где-то считываем заголовок:

Код:
   FileSeek( FileHandle, 0, 0);
   FileRead( FileHandle, Header, SizeHeader);
   FileSeek( FileHandle, nRead, 2);
делаем изменение и обновляем файл:

Код:
procedure UpdateWaveHeader(DataSize: Integer);
begin
  Header.ChunkSise := 36 + (DataSize - 44); // изменяем размер данных на новый
  Header.SubChunk2Size := (DataSize - 44);
end;

procedure WriteWaveHeader;
begin
  if FCopyHandle > 0 then
  begin
    FileSeek(FileHandle, 0, 0);
    FileWrite(FileHandle, Header, 44);
    FileSeek(FileHandle, 0, 2);
  end;
end;
Ответить с цитированием
  (#4 (permalink)) Старый
Shturmovik Shturmovik вне форума
Member
 
Сообщений: 106
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 27.11.2005
По умолчанию 06.12.2006, 11:09

ZonD,
помоги пожалуйста. Вот нашёл информацию, но ничего не понимаю: http://pascal.sources.ru/articles/099.htm
Мне надо просто имеющийся файл Pic.bmp сохранить с 2мя параметрами разрешения как нули. Заранее спасибо!
Ответить с цитированием
  (#5 (permalink)) Старый
ZonD ZonD вне форума
Member
 
Сообщений: 205
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 07.04.2004
По умолчанию 06.12.2006, 13:17

гы, ладно короче делай так:
TBitMap хранится в ,b,kbjntrt Graphics.

Код:
Procedure LoadAndSaveBMP( FileName:String; Width: integer; Heigth: integer );
var
  BMPFILE: TBitMap;
begin
  try
    BMPFILE:= TBitMap.Create;
    BMPFILE.LoadFromFile( Filename );
    BMPFILE.Width := Width;
    BMPFILE.Height := Height;
    BMPFILE.SaveToFile( FileName );
  finally
    FreeAndNil( BMPFILE );
  end;
end;
проще некуда!
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
Shturmovik Shturmovik вне форума
Member
 
Сообщений: 106
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 27.11.2005
По умолчанию 06.12.2006, 15:46

Цитата:
гы, ладно короче делай так:
TBitMap хранится в ,b,kbjntrt Graphics.

<div class='codetop'>Код Pascal
<div class='codemain'>Procedure LoadAndSaveBMP( FileName:String; Width: integer; Heigth: integer );
var
BMPFILE: TBitMap;
begin
try
BMPFILE:= TBitMap.Create;
BMPFILE.LoadFromFile( Filename );
BMPFILE.Width := Width;
BMPFILE.Height := Height;
BMPFILE.SaveToFile( FileName );
finally
FreeAndNil( BMPFILE );
end;
end;[/code]

проще некуда![/quote]


Не-не! ты неправильно понял. Разрешение это не размеры. Это количество точек растра на дюйм. (это написано там куда я дал ссылку)
Ответить с цитированием
  (#7 (permalink)) Старый
AfIS AfIS вне форума
Member
 
Сообщений: 384
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 08.02.2005
По умолчанию 06.12.2006, 19:59

Цитата:
Вот нашёл информацию, но ничего не понимаю: http://pascal.sources.ru/articles/099.htm
Структура файла -> Информационный заголовок: там же XpelsPerMeter/YpelsPerMeter (Горизонтальное разрешение, точки на метр/Вертикальное разрешение, точки на метр) прямо поле такое есть. Ну так и изменяй его. Это, как там написано, - по 4 байта со смещений 38 и 42 соотв. Можно просто открыть файл как нетипизированный и:

Код:
Seek(38)
Write(F, Buf1, 4);
Write(F, Buf2, 4);
где Buf1, Buf2 - новые значения разреш-я по гор. и верт. соотв.
Переменные 4 байта должны быть (Integer)

А для каких конспиратифных целей это надо, если не секрет
Ответить с цитированием
  (#8 (permalink)) Старый
Shturmovik Shturmovik вне форума
Member
 
Сообщений: 106
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 27.11.2005
По умолчанию 07.12.2006, 14:22

Цитата:
А для каких конспиратифных целей это надо, если не секрет
Я работаю с файлом BMP, созданным с помощью спциального оборудования, его разрешение слишком низкое. Поэтому когда рисую на его канве возникает куча проблем. С нормальным разрешением всё как по маслу

Я не очень знаю Дельфи, но так понял что сначала надо связать файл Assign, потом открыть Open, потом изменить параметры и просто перезаписать, да?
Ответить с цитированием
  (#9 (permalink)) Старый
AfIS AfIS вне форума
Member
 
Сообщений: 384
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 08.02.2005
По умолчанию 08.12.2006, 06:15

Наверное ты хочешь увеличить количество пикселей самой картинки. Разрешение - это всего лишь отношение количества пикселей на единицу площади (на которой они расположены). Можно сказать что 640x480 для монитора маленькое разрешение, а для телефона - большое, так как площадь, на которой расположено одинаковое кол-во пикселей, у них различна.
Я думал ты хочешь какую-то прогу обмануть или для вывода на пкчать надо.
Иэменением этих полей саму картинку не исправишь. Эти поля содержат информацию о физических размерах оригинала.
Если надо увеличить кол-во пикселей, то см. что посоветовал ZonD. Только при изменении Width и Height картинка не растянится, а просто увеличится; а по краям будут белые полосы.
Лучше так:
Код:
Procedure LoadAndSaveBMP( FileName:String; Width: integer; Heigth: integer );
var
  BMPSrc: TBitMap;
  BMPDst: TBitMap;
begin
  try
    BMPSrc:= TBitMap.Create;
    BMPDst:= TBitMap.Create;
    BMPSrc.LoadFromFile( Filename );
    BMPDst.Width := <Сколько нужно1>;
    BMPDst.Height := <Сколько нужно2>;
    BMPDst.Canvas.StretchDraw(Rect(0, 0, BMPDst.Width, BMPDst.Height), BMPSrc);
    BMPDst.SaveToFile( FileName );
  finally
    FreeAndNil( BMPSrc );
    FreeAndNil( BMPDst );
  end;
end;
Или типа того...
Ответить с цитированием
  (#10 (permalink)) Старый
LARS LARS вне форума
Member
 
Сообщений: 568
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 20.06.2005
По умолчанию 09.12.2006, 11:54

и все же при использовании StretchDraw применяется примитивный алгоритм масштабирования. Потерь и искажений не избежать. Если достаточно - ок, а если нет - надо искать покруче технологнии.
Ответить с цитированием
  (#11 (permalink)) Старый
AfIS AfIS вне форума
Member
 
Сообщений: 384
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 08.02.2005
По умолчанию 10.12.2006, 11:52

Можно в какой-нибудь программе увеличить кол-во пикселей. Например в ACDSee или (для "покруче") в Фотошопе.
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как изменять форму на сайте sergok Вопросы начинающих программистов 1 07.06.2011 12:57
Можно ли изменять размер байтов в оперативной памяти Boris_K C++ Builder 3 28.05.2011 01:05
ALTER TABLE как изменять размер таблицы INGRID SQL 6 18.04.2011 02:57
Как изменять кодлировку на сайте rg2570 ASP 0 04.05.2007 20:37
RGB в VBE можно ли изменять составляющие Alter Программирование графики 1 25.03.2007 17:32
Как программно изменять ситили Casper DHTML, JavaScript, VBScript 3 27.07.2006 11:27
Как можно запретить изменять размер одного из столбцов в CListCtrl Василий Теркин Visual C++ 1 05.07.2006 18:39
Как изменять форму кнопок на С++ yta Visual C++ 1 18.04.2005 11:12
SizeAllFiles размер всех файлов выводит неправильный размер lexey Delphi 7 01.12.2004 19:04
Как изменять элементы браузера GEV_256 Офтопик 0 14.11.2003 19:11
Кодировка в Indy как ее изменять Anonymous Delphi 1 09.09.2003 21:32
Размер кнопки как изменять pav DHTML, JavaScript, VBScript 1 11.04.2003 21:15



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов