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

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

PS Просто создаю TBitmap.Create; и рисую на нем через Canvas
...
Рейтинг: 0 / 0
17.05.2018, 17:46
    #39646295
Соколинский Борис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли задать dpi при сохранении (или создании) Bitmap?
Devillio,
свойства TBitmap изучи внимательно .
...
Рейтинг: 0 / 0
17.05.2018, 17:51
    #39646298
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли задать dpi при сохранении (или создании) Bitmap?
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
17.05.2018, 17:52
    #39646301
Соколинский Борис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли задать dpi при сохранении (или создании) Bitmap?
упс, по памяти написал не проверив.
В общем так
1. HandleType:=dmDIB;
2. GetObject(Handle) - вернет DIBSection.
3. находишь там BitmapInfoHeader и задаешь X/Y PelsPerMeter.

Второй способ - уже в сохраненном файле меняешь 8 байтов.
...
Рейтинг: 0 / 0
18.05.2018, 08:38
    #39646507
Devillio
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли задать dpi при сохранении (или создании) Bitmap?
Соколинский БорисВторой способ - уже в сохраненном файле меняешь 8 байтов.
о, большое спасибо! вот это прям подошло
...
Рейтинг: 0 / 0
18.05.2018, 15:32
    #39646776
Devillio
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли задать dpi при сохранении (или создании) Bitmap?
Блин ((( проблема продолжилась.
Пользователям не понравилось перетаскивать рисунок руками из файла, просят чтобы шаблон формировался сразу с рисунком.
В 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
18.05.2018, 16:52
    #39646812
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли задать dpi при сохранении (или создании) Bitmap?
Devillio,

Не оно ?
...
Рейтинг: 0 / 0
18.05.2018, 17:48
    #39646834
Соколинский Борис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли задать dpi при сохранении (или создании) Bitmap?
Devillio,
Просто расчитай нужны размер и сделай MFCanvas.StretctDraw() вместо Draw()
...
Рейтинг: 0 / 0
21.05.2018, 08:25
    #39647367
Devillio
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли задать dpi при сохранении (или создании) Bitmap?
Большое спасибо за помощь!
Решил через формат 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
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Можно ли задать dpi при сохранении (или создании) Bitmap? / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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