powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Можно ли задать dpi при сохранении (или создании) Bitmap?
9 сообщений из 9, страница 1 из 1
Можно ли задать dpi при сохранении (или создании) Bitmap?
    #39646286
Devillio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Делаю файлик bmp, сохраняю, вставляю в ворд - он растягивается на весь лист.
А если делаю его размер гораздо меньше (более-менее подходящий при вставке в ворд), то линии и текст становятся пикселевидными.
Очевидно, надо как-то поднять dpi сохраняемого изображения, не могу найти как.

Подскажите? Спасибо!

PS Просто создаю TBitmap.Create; и рисую на нем через Canvas
...
Рейтинг: 0 / 0
Можно ли задать dpi при сохранении (или создании) Bitmap?
    #39646295
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Devillio,
свойства TBitmap изучи внимательно .
...
Рейтинг: 0 / 0
Можно ли задать dpi при сохранении (или создании) Bitmap?
    #39646298
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
17.05.2018 17:36, Devillio пишет:
> Делаю файлик bmp, сохраняю, вставляю в ворд - он растягивается на весь лист.
> А если делаю его размер гораздо меньше (более-менее подходящий при вставке в ворд), то линии и текст становятся пикселевидными.
> Очевидно, надо как-то поднять dpi сохраняемого изображения, не могу найти как.
>
> Подскажите? Спасибо!
>
> PS Просто создаю TBitmap.Create; и рисую на нем через Canvas

видишь ли бамбино, bmp и TBitmap вообще две большие разницы.
сам формат bmp содержит поля XPelsPerMeter и YPelsPerMeter.
но TBitmap изначально было на них нас рать.
по крайней мере так было да исторического материализма.
может в новомодных дельфях это уже и не так.
(сильно сомневаюсь)

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Можно ли задать dpi при сохранении (или создании) Bitmap?
    #39646301
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
упс, по памяти написал не проверив.
В общем так
1. HandleType:=dmDIB;
2. GetObject(Handle) - вернет DIBSection.
3. находишь там BitmapInfoHeader и задаешь X/Y PelsPerMeter.

Второй способ - уже в сохраненном файле меняешь 8 байтов.
...
Рейтинг: 0 / 0
Можно ли задать dpi при сохранении (или создании) Bitmap?
    #39646507
Devillio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Соколинский БорисВторой способ - уже в сохраненном файле меняешь 8 байтов.
о, большое спасибо! вот это прям подошло
...
Рейтинг: 0 / 0
Можно ли задать dpi при сохранении (или создании) Bitmap?
    #39646776
Devillio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Блин ((( проблема продолжилась.
Пользователям не понравилось перетаскивать рисунок руками из файла, просят чтобы шаблон формировался сразу с рисунком.
В rtf рисунок входит как metafile. Нашел и как в rtf, и как bmp->wmf формировать.
Ну всю голову изломал, как его-то теперь dpi поменять.
Текст
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
function TdlgOutTemplateCreate.ConvertBitmatToEMF(ABMP: TBitmap): String;
var
  MF: TMetafile;
  MFCanvas: TMetafileCanvas;
  aHDC: HDC;
  MS: TMemoryStream;
  hexpict: String;
  i: Integer;
  B: Byte;
begin
  try
    hexpict := '';
    MF := TMetafile.Create;
    MF.Width := ABMP.Width;
    MF.Height := ABMP.Height;

    aHDC := CreateDC('DISPLAY', nil, nil, nil); 
    SetMapMode(aHDC, MM_TWIPS); //думал это как то поможет, но нет, рисунок огромный в документе

    MFCanvas := TMetafileCanvas.Create(MF, aHDC);
    try
      MFCanvas.Draw(0,0,ABMP);
    finally
      MFCanvas.Free;
    end;
    MF.Inch := 1200;

    MS := TMemoryStream.Create;
    MF.SaveToStream(MS);

    MS.Position := 0;

    for i := 0 to MS.Size-1 do
    begin
      MS.Read(B,1);
      hexpict := hexpict + IntToHex(Integer(B), 2);
    end;

    Result := '{\pict\emfblip '+hexpict+'}';

  finally
    MS.Position := 0;
//    MS.SaveToFile(ExtractFileDir(ParamStr(0))+'\test.emf');

    FreeAndNil(MF);
    FreeAndNil(MS);
  end;
end;

...
Рейтинг: 0 / 0
Можно ли задать dpi при сохранении (или создании) Bitmap?
    #39646812
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Devillio,

Не оно ?
...
Рейтинг: 0 / 0
Можно ли задать dpi при сохранении (или создании) Bitmap?
    #39646834
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Devillio,
Просто расчитай нужны размер и сделай MFCanvas.StretctDraw() вместо Draw()
...
Рейтинг: 0 / 0
Можно ли задать dpi при сохранении (или создании) Bitmap?
    #39647367
Devillio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Большое спасибо за помощь!
Решил через формат rtf, там можно просто задать скалирование отображаемой картинки.
Всего-то добавить 2 команды \picscalex и \picscaley, а саму картинку делать с размером достаточного качества.
Не претендую на качество кода, однако, работает, вдруг кому понадобится
Как вставить bmp картинку в rtf разметку
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
function TdlgOutTemplateCreate.ConvertBitmatToEMF(ABMP: TBitmap; AScale: Integer): String;
var
  MF: TMetafile;
  MFCanvas: TMetafileCanvas;
  aHDC: HDC;
  MS: TMemoryStream;
  hexpict,S: String;
  i: Integer;
  B: Byte;
begin
  try
    hexpict := '';
    MF := TMetafile.Create;
    MF.Width := ABMP.Width;
    MF.Height := ABMP.Height;
    MF.Enhanced := True;

    aHDC := CreateDC('DISPLAY', nil, nil, nil);

    MFCanvas := TMetafileCanvas.Create(MF, aHDC);
    try
      MFCanvas.Draw(0,0,ABMP);
    finally
      MFCanvas.Free;
    end;
    MS := TMemoryStream.Create;
    MF.SaveToStream(MS);

    MS.Position := 0;

    for i := 0 to MS.Size-1 do
    begin
      MS.Read(B,1);
      hexpict := hexpict + IntToHex(Integer(B), 2);
    end;

    S := ''; if not (AScale in [0,100]) then S := '\picscalex'+IntToStr(AScale)+'\picscaley'+IntToStr(AScale);

    Result := '{\pict'+S+'\emfblip '+hexpict+'}';

  finally
    MS.Position := 0;
    FreeAndNil(MF);
    FreeAndNil(MS);
  end;
end;

//возвращает готовый тег для вставки картинки в текст как отдельного абзаца

...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Можно ли задать dpi при сохранении (или создании) Bitmap?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]