Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Звук, графика и видео > Изменить разрешние картинки


Автор: XAKEPEHOK 18.1.2009, 20:45
Доброго времени суток! У меня возникла проблема, в которой у меня даже больше теоретические проблемы.
У меня имеется картинка *.bmp. Мне нужно изменить ее разрешение в ppi до определенного, чтобы в дальнейшем вывести на печать.
Как мне это сделать? Вот что нашел в дркб

Код

type
BITMAPFILEHEADER = packed record
   bfType:WORD; //Сигнатура BM
   bfSize:DWORD; //Размер файла
   bfReserved1:WORD; //Зарезервировано, всегда 0
   bfReserved2:WORD; //Тот же случай
   bfOffBits:DWORD; //Смещение(в байтах) от заголовка(его размер)
end;
 
BITMAPINFOHEADER = packed record
   biSize:DWORD; //Число байтов, необходимых этой структуре
   biWidth:LONGWORD; //Ширина
   biHeight:LONGWORD; //Высота
   biPlanes:WORD; //Число плоскостей устройства. =1
   biBitCount:WORD; //Число битов на пиксел. В примере =24
   biCompression:DWORD; //Тип сжатия. В примере =0(т.е. нет)
   biSizeImage:DWORD; //Размер изобр. 0, если нет сжатия
   biXPelsPerMeter:LONGWORD; //Горизонтальное разрешение (пиксел/м)
   biYPelsPerMeter:LONGWORD; //Вертикальное разрешение (пиксел/м)
   biClrUsed:DWORD; //Используемые цвета. 0 - исп. все
   biClrImportant:DWORD; //Важные цвета. 0 - все важны
end;
//Если хотите знать больше, смотрите SDK->Поиск->BMP->Bitmap Storage
implementation 

{$R *.dfm} 

procedure FileToBMP(FileName:String;w,h:Integer);
var
bmp,aFile:TStream;
begin
bmp:=TFileStream.Create(FileName+'.bmp',fmCreate);
aFile:=TFileStream.Create(FileName,fmOpenRead);
 

bf.bfType:=$4D42; //= BM
bf.bfReserved1:=0;
bf.bfReserved2:=0;
bf.bfOffBits:=SizeOf(BITMAPFILEHEADER)+SizeOf(BITMAPINFOHEADER); 

bi.biSize:=SizeOf(BITMAPINFOHEADER);
bi.biWidth:=w;
bi.biHeight:=h;
bi.biPlanes:=1;
bi.biBitCount:=24;
bi.biCompression:=0;
bi.biSizeImage:=w*h*3;//24бита = 3байта
//остальное в этом примере = 0
bi.biXPelsPerMeter:=0;
bi.biYPelsPerMeter:=0;
bi.biClrUsed:=0;
bi.biClrImportant:=0;
 

bf.bfSize:=bf.bfOffBits+bi.biSizeImage;
//запись заголовка
bmp.Write(bf,SizeOf(BITMAPFILEHEADER));
bmp.Write(bi,SizeOf(BITMAPINFOHEADER));
//запись точек(кол-во байтов = bi.biSizeImage)
bmp.CopyFrom(aFile,bi.biSizeImage); 

bmp.Free;
aFile.Free;
 

end;


но это то или нет? Во первых у меня это даже не компилится. Если это то, то можно пример использования?
Я вообще запутался со всеми этими dpi и ppi

Автор: ~FoX~ 31.1.2009, 11:09
ppi - количество пихелей на дюйм
dpi - точек на дюйм... DPI*Nc = 1 PPI, где Nc количество цветов используемых в картинки...

Так использоваться этот пример....Ты же описал типы, а приминить их забыл  smile 
Код

type
BITMAPFILEHEADER = packed record
   bfType:WORD; //Сигнатура BM
   bfSize:DWORD; //Размер файла
   bfReserved1:WORD; //Зарезервировано, всегда 0
   bfReserved2:WORD; //Тот же случай
   bfOffBits:DWORD; //Смещение(в байтах) от заголовка(его размер)
end;

BITMAPINFOHEADER = packed record
   biSize:DWORD; //Число байтов, необходимых этой структуре
   biWidth:LONGWORD; //Ширина
   biHeight:LONGWORD; //Высота
   biPlanes:WORD; //Число плоскостей устройства. =1
   biBitCount:WORD; //Число битов на пиксел. В примере =24
   biCompression:DWORD; //Тип сжатия. В примере =0(т.е. нет)
   biSizeImage:DWORD; //Размер изобр. 0, если нет сжатия
   biXPelsPerMeter:LONGWORD; //Горизонтальное разрешение (пиксел/м)
   biYPelsPerMeter:LONGWORD; //Вертикальное разрешение (пиксел/м)
   biClrUsed:DWORD; //Используемые цвета. 0 - исп. все
   biClrImportant:DWORD; //Важные цвета. 0 - все важны
end;


implementation

{$R *.dfm}


procedure FileToBMP(FileName:String;w,h:Integer);
var
  bmp,aFile:TStream;
  bf: BITMAPFILEHEADER; // Вот это надо добавить
  bi: BITMAPINFOHEADER; // И вот это тоже
begin
  bmp:=TFileStream.Create(FileName+'.bmp',fmCreate);
  aFile:=TFileStream.Create(FileName,fmOpenRead);

  bf.bfType:=$4D42; //= BM
  bf.bfReserved1:=0;
  bf.bfReserved2:=0;
  bf.bfOffBits:=SizeOf(BITMAPFILEHEADER)+SizeOf(BITMAPINFOHEADER);
  bi.biSize:=SizeOf(BITMAPINFOHEADER);
  bi.biWidth:=w;
  bi.biHeight:=h;
  bi.biPlanes:=1;
  bi.biBitCount:=24;
  bi.biCompression:=0;
  bi.biSizeImage:=w*h*3;//24бита = 3байта
  //остальное в этом примере = 0
  bi.biXPelsPerMeter:=0;
  bi.biYPelsPerMeter:=0;
  bi.biClrUsed:=0;
  bi.biClrImportant:=0;
  bf.bfSize:=bf.bfOffBits+bi.biSizeImage;
  //запись заголовка
  bmp.Write(bf,SizeOf(BITMAPFILEHEADER));
  bmp.Write(bi,SizeOf(BITMAPINFOHEADER));
  //запись точек(кол-во байтов = bi.biSizeImage)
  bmp.CopyFrom(aFile,bi.biSizeImage);
  bmp.Free;
  aFile.Free;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
  FileToBMP('c:\1.bmp', 1280, 960);
end;

Не очень понятно тебе нужно менять именно разрешение или размер...

Автор: XAKEPEHOK 31.1.2009, 11:15
Спасибо.
Мне нужно в итоге распечатать картинку с заданным разрешением в ppi

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)