Вверх ↑
Этот топик читают: Гость
Ответов: 413
Рейтинг: 57
#46: 2014-01-12 23:24:59 ЛС | профиль | цитата
nesco писал(а):
Он не работает в FPC
ясно, почти все достаточно хорошо работает под FPC, что начал забывать что такое возможно.

nesco, а в каком формате подаются данные картинки в RichEdit? и как перегнать ее в этот формат
карма: 0

0
Разработчик
Ответов: 26066
Рейтинг: 2120
#47: 2014-01-13 00:05:59 ЛС | профиль | цитата
Poputchik писал(а):
а в каком формате подаются данные картинки в RichEdit

Епть, ты как читаешь
nesco писал(а):
картинка должна быть bmp

У Rich даже точка есть для этого специальная
doAddBitmap=Вставка картинки в текст
карма: 22

0
Ответов: 413
Рейтинг: 57
#48: 2014-01-13 00:24:37 ЛС | профиль | цитата
nesco писал(а):
ты как читаешь

Я не верно выразился.
Меня интересует не то, что в bmb должна быть картинка при подаче ее на соответствующую точку компонента RichEdit, а то в каком виде (формате) эта картинка сохраняется в rtf. Если я правильно понял, то RichEdit ее конвертирует в иной формат при сохранении файла (Или еще когда не знаю). На просторе интернета пишут про .wmf. И про различные способы перегона в этот формат. Но примеры, что нашел на С++. Вот и спрашиваю. Может я чего не понял про этот формат, может данные двоичными сохраняются или еще какими. При открытии в блокноте вообще показывает что в файле 2 картинки и они представлены в разном формате (каком не знаю) (Правда это при сохранении rtf из word). Цель перебрать метки в документе и где нужно вставить картинки не прибегая к RichEdit. Я предположил, раз RichEdit принимает картинки, значит люди разбирающиеся в его устройстве возможно знают в каком виде сохраняется картинка в нем (или в самом файле .rtf).

карма: 0

0
Разработчик
Ответов: 26066
Рейтинг: 2120
#49: 2014-01-13 00:58:15 ЛС | профиль | цитата
Poputchik писал(а):
в каком виде (формате) эта картинка сохраняется в rtf

А вот это не поможет -- http://articles.org.ru/docum/rtf.php
Похоже, что там действительно метафайл. Надо смотреть, как шифруется этот метафайл.
карма: 22

0
Ответов: 413
Рейтинг: 57
#50: 2014-01-13 01:28:34 ЛС | профиль | цитата
Подобную спецификацию находил, но эта полнее.
nesco писал(а):
Похоже, что там действительно метафайл. Надо смотреть, как шифруется этот метафайл

Значит картинку предворительно нужно зашифровать по какому-то алгоритму? Мда. Чем дальше в лес, тем больше палок.

карма: 0

0
Разработчик
Ответов: 26066
Рейтинг: 2120
#51: 2014-01-13 01:31:06 ЛС | профиль | цитата
Poputchik писал(а):
Мне нужно понять в какой формат перегнать картинку, прежде чем ее поместить в rtf

Кодирование довольно простое, надо просто в IC перенести метод BitmapToRTF из юнита KOLOleRE.pas. Там действительно bmp используется
А вот декодирование после сохранение, там уже метафйаловые данне получаются
карма: 22

1
Голосовали:Poputchik
Ответов: 413
Рейтинг: 57
#52: 2014-01-13 02:11:47 ЛС | профиль | цитата
nesco писал(а):
А вот декодирование после сохранение

Ну это уже чтоб прочитать эту картинку при открытии документа? Это уже не важно. Готовый документ будет в word открываться. Пусть word декодирует.

nesco писал(а):
надо просто в IC перенести метод BitmapToRTF из юнита KOLOleRE.pas

Не лазил еще в компоненты и куски не выдирал - попробую.
------------ Дoбавленo в 02.11:
nesco, не поможешь правильно вставить требуемый кусочек кода в IC. Думал с налета методом тыка, но знаний на уровне if then end явно маловато.
карма: 0

0
Разработчик
Ответов: 26066
Рейтинг: 2120
#53: 2014-01-13 03:06:10 ЛС | профиль | цитата
Как-то так -- bitmaptortf.sha
карма: 22

1
файлы: 1bitmaptortf.sha [20.9KB] [631]
Голосовали:Poputchik
Ответов: 413
Рейтинг: 57
#54: 2014-01-13 20:05:52 ЛС | профиль | цитата
В word не хочет открываться, а в wordPade картинка нормально открывается при сохранении в rtf. Это уже очень хорошо!
------------ Дoбавленo в 16.23:
Чтобы word открывал картинку используемую nesco в примере вставил такую строку: \pict\picwgoal960\pichgoal960\dibitmap0\wbmwidthbytes192\picw64\pich64
вместо: {\pict\dibitmap
здесь picwgoal - ширина рисунка в twips ( по умолчанию в word 1 пиксель = 15 twips; Если кому пригодится, то А4=12240x15840 twips или 210х297 мм или 8,3x11,7 дюйма; разрешение картинки 220 пикселей на дюйм настройки word по умолчанию)
pichgoal - высота рисунка в twips
picw - высота рисунка в пикселях
pich - ширина рисунка в пикселях
wbmwidthbytes - определяет длину битовой карты в байтах

Как посчитать длину битовой карты в байтах?
------------ Дoбавленo в 20.05:
Не разобрался как определяет длину битовой карты в байтах, но если указать wbmwidthbytes1, то word и NotePad открывает.
Ниже привел пример как в rtf добавил рисунок. В компоненте IC изменил строку-> rtf := rtf + hexpict + ' }}'; на строку -> rtf := hexpict; Чтобы вне IC сформировать строку с кортинкой. В принципе все в IC можно сделать, но я пока не умею. Вроде бы нормально вставляются не только bmp, но и другие форматы. Если вставлять картинку в уже существующий файл .rtf, нужно из FormatStr убрать "{\\rtf1" в начале и "}" в конце. Недостаток - libreOfice такие картинки не понимает.

Add(MainForm,6377583,343,56)
{
Width=424
Height=391
Caption="BitmapToRTF"
}
Add(InlineCode,15105491,259,427)
{
WorkPoints=#13:doBitmapToRTF|
EventPoints=#13:onBitmapToRTF|
VarPoints=#6:Result|
DataPoints=#6:Bitmap|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|29:uses Windows,kol,Share,Debug;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|17: Res: String;|9: public|12: Bitmap,|30: onBitmapToRTF: THI_Event;|58: procedure doBitmapToRTF(var _Data:TData; Index:word);|56: procedure Result(var _Data:TData; Index:word); |5: end;|0:|14:implementation|0:|88:function BytesPerScanline(PixelsPerScanline, BitsPerPixel, Alignment: Longint): Longint;|5:begin|17: Dec(Alignment);|79: Result := ((PixelsPerScanline * BitsPerPixel) + Alignment) and not Alignment;|25: Result := Result div 8;|4:end;|0:|80:procedure InitializeBitmapInfoHeader(Bitmap: HBITMAP; var BI: TBitmapInfoHeader;|19: Colors: Integer);|3:var|18: DS: TDIBSection;|17: Bytes: Integer;|5:begin|24: DS.dsbmih.biSize := 0;|46: Bytes := GetObject(Bitmap, SizeOf(DS), @DS);|35: if Bytes = 0 then {InvalidBitmap}|62: else if (Bytes >= (sizeof(DS.dsbm) + sizeof(DS.dsbmih))) and|55: (DS.dsbmih.biSize >= DWORD(sizeof(DS.dsbmih))) then|19: BI := DS.dsbmih|6: else|7: begin|32: FillChar(BI, sizeof(BI), 0);|23: with BI, DS.dsbm do|9: begin|27: biSize := SizeOf(BI);|25: biWidth := bmWidth;|27: biHeight := bmHeight;|8: end;|6: end;|16: case Colors of|26: 2: BI.biBitCount := 1;|10: 3..16:|11: begin|27: BI.biBitCount := 4;|31: BI.biClrUsed := Colors;|10: end;|12: 17..256:|11: begin|27: BI.biBitCount := 8;|31: BI.biClrUsed := Colors;|10: end;|6: else|60: BI.biBitCount := DS.dsbm.bmBitsPixel * DS.dsbm.bmPlanes;|6: end;|19: BI.biPlanes := 1;|42: if BI.biClrImportant > BI.biClrUsed then|38: BI.biClrImportant := BI.biClrUsed;|28: if BI.biSizeImage = 0 then|89: BI.biSizeImage := BytesPerScanLine(BI.biWidth, BI.biBitCount, 32) * Abs(BI.biHeight);|4:end;|0:|73:procedure InternalGetDIBSizes(Bitmap: HBITMAP; var InfoHeaderSize: DWORD;|41: var ImageSize: DWORD; Colors: Integer);|3:var|24: BI: TBitmapInfoHeader;|5:begin|49: InitializeBitmapInfoHeader(Bitmap, BI, Colors);|27: if BI.biBitCount > 8 then|7: begin|48: InfoHeaderSize := SizeOf(TBitmapInfoHeader);|52: if (BI.biCompression and BI_BITFIELDS) <> 0 then|30: Inc(InfoHeaderSize, 12);|5: end|6: else|28: if BI.biClrUsed = 0 then|51: InfoHeaderSize := SizeOf(TBitmapInfoHeader) +|48: SizeOf(TRGBQuad) * (1 shl BI.biBitCount)|8: else|51: InfoHeaderSize := SizeOf(TBitmapInfoHeader) +|40: SizeOf(TRGBQuad) * BI.biClrUsed;|30: ImageSize := BI.biSizeImage;|4:end;|0:|59:function InternalGetDIB(Bitmap: HBITMAP; Palette: HPALETTE;|54: var BitmapInfo; var Bits; Colors: Integer): Boolean;|3:var|19: OldPal: HPALETTE;|10: DC: HDC;|5:begin|76: InitializeBitmapInfoHeader(Bitmap, TBitmapInfoHeader(BitmapInfo), Colors);|14: OldPal := 0;|30: DC := CreateCompatibleDC(0);|5: try|24: if Palette <> 0 then|9: begin|50: OldPal := SelectPalette(DC, Palette, False);|25: RealizePalette(DC);|8: end;|85: Result := GetDIBits(DC, Bitmap, 0, TBitmapInfoHeader(BitmapInfo).biHeight, @Bits,|52: TBitmapInfo(BitmapInfo), DIB_RGB_COLORS) <> 0;|9: finally|57: if OldPal <> 0 then SelectPalette(DC, OldPal, False);|17: DeleteDC(DC);|6: end;|4:end;|0:|87:function GetDIB(Bitmap: HBITMAP; Palette: HPALETTE; var BitmapInfo; var Bits): Boolean;|5:begin|65: Result := InternalGetDIB(Bitmap, Palette, BitmapInfo, Bits, 0);|4:end;|0:|65:procedure GetDIBSizes(Bitmap: HBITMAP; var InfoHeaderSize: DWORD;|24: var ImageSize: DWORD);|5:begin|60: InternalGetDIBSizes(Bitmap, InfoHeaderSize, ImageSize, 0);|4:end;|0:|36:procedure THiAsmClass.doBitmapToRTF;|3:var|16: pict: PBitmap;|22: bi, bb, rtf: string;|21: bis, bbs: Cardinal;|21: achar: ShortString;|18: hexpict: string;|13: I: Integer;|5:begin|36: pict := ReadBitmap(_Data, Bitmap);|43: if (pict = nil) or pict.Empty then exit; |37: GetDIBSizes(pict.Handle, bis, bbs);|21: SetLength(bi, bis);|21: SetLength(bb, bbs);|63: GetDIB(pict.Handle, {pict.Palette}0, PChar(bi)^, PChar(bb)^);|35: rtf := '{\rtf1 {\pict\dibitmap ';|52: SetLength(hexpict, (Length(bb) + Length(bi)) * 2);|9: I := 2;|31: for bis := 1 to Length(bi) do|7: begin|46: achar := Format('%x', [Integer(bi[bis])]);|29: if Length(achar) = 1 then|27: achar := '0' + achar;|31: hexpict[I - 1] := achar[1];|27: hexpict[I] := achar[2];|14: Inc(I, 2);|6: end;|31: for bbs := 1 to Length(bb) do|7: begin|46: achar := Format('%x', [Integer(bb[bbs])]);|29: if Length(achar) = 1 then|27: achar := '0' + achar;|31: hexpict[I - 1] := achar[1];|27: hexpict[I] := achar[2];|14: Inc(I, 2);|6: end;|17: rtf := hexpict;|13: Res := rtf;|34: _hi_onEvent(onBitmapToRTF, Res);|4:end;|0:|31:procedure THiAsmClass.Result; |5:begin|23: dtString(_Data, Res);|4:end;|0:|4:end.|
link(onBitmapToRTF,3187995:doString,[])
link(Bitmap,9409407:Var1,[(265,215)])
}
Add(Image,1784306,588,245)
{
Left=10
Top=5
Width=389
Height=314
}
Add(Button,6878971,203,427)
{
Left=185
Top=330
Width=145
TabOrder=-1
Caption="Convert and save"
link(onClick,15105491:doBitmapToRTF,[])
}
Add(DoData,13784179,525,245)
{
link(onEventData,1784306:doLoad,[])
link(Data,9409407:Var3,[(531,215)])
}
Add(Memory,3554077,525,357)
{
}
Add(Hub,6723405,462,462)
{
link(onEvent1,3554077:doValue,[(494,468)(494,363)])
link(onEvent2,13976449:doSave,[(501,475)(501,447)])
}
Add(FormatStr,3187995,315,427)
{
DataCount=6
Mask="{\\rtf1\r\n{\pict\picwgoal%3\pichgoal%4\dibitmap0\wbmwidthbytes%5\picw%1\pich%2 %6}\r\n}"
link(onFString,6562553:doEvent1,[])
link(Str1,8925798:Var2,[])
link(Str2,10901942:Var2,[])
link(Str3,1995975:GetData,[(335,285)(356,285)])
link(Str4,11261605:GetData,[(342,362)(356,362)])
link(Str5,2636429:Value,[(349,404)(370,404)])
}
Add(Math,12503346,399,245)
{
OpType=2
Op2=15
link(onResult,1995975:doData,[(438,251)(438,223)(340,223)(340,251)])
link(Op1,8925798:Var3,[(405,229)])
}
Add(EventFromData,1995975,350,245)
{
link(onEvent,12503346:doOperation,[])
}
Add(GetDataEx,8925798,315,224)
{
link(Data,3518371:ImageWidth,[])
}
Add(Math,5941506,399,322)
{
OpType=2
Op2=15
link(onResult,11261605:doData,[(438,328)(438,300)(340,300)(340,328)])
link(Op1,10901942:Var3,[(405,306)])
}
Add(EventFromData,11261605,350,322)
{
link(onEvent,5941506:doOperation,[])
}
Add(GetDataEx,10901942,322,301)
{
link(Data,3518371:ImageHeight,[])
}
Add(GetDataEx,9409407,308,210)
{
link(Data,3518371:Bitmap,[])
}
Add(Memory,2636429,364,364)
{
Default=Integer(1)
}
Add(SDialog,6614388,413,462)
{
Filter="All|*.rtf"
FileName="документ.rtf"
link(onExecute,6723405:doEvent1,[])
}
Add(ODialog,13094071,259,161)
{
Filter="Изображение|*.*"
Title="Выбор изображения"
FileName="Изображение"
link(onExecute,3518371:doLoad,[])
}
Add(Button,15309747,210,161)
{
Left=105
Top=330
TabOrder=-1
Caption="Оpen"
link(onClick,13094071:doExecute,[])
}
Add(Img_Loader,3518371,308,161)
{
Point(ImageWidth)
Point(ImageHeight)
link(onLoad,13784179:doData,[(501,167)(501,251)])
}
Add(StrList,13976449,518,406)
{
link(FileName,3554077:Value,[])
}
Add(Hub,6562553,371,427)
{
link(onEvent1,13976449:doText,[])
link(onEvent2,6614388:doExecute,[(403,440)(403,468)])
}


карма: 0

0
Ответов: 413
Рейтинг: 57
#55: 2014-01-23 19:24:37 ЛС | профиль | цитата
nesco писал(а):
Как-то так

При перекодировании больших картинок (приблизительно 670х940px)иногда происходит какая то "ошибка" и информация записывается в виде нулей. В word это выглядит как черная область. Не подскажите с чем это может быть связано и есть ли спсобы борьбы с этим.
Может в отдельном потоке делать перегонку картинки или заведомо есть какие то ограничения, или еще какой то важный нюанс?
карма: 0

0
Гость
Ответов: 17029
Рейтинг: 0
#56: 2014-01-23 19:35:24 правка | ЛС | профиль | цитата


Редактировалось 3 раз(а), последний 2021-05-21 06:16:07
карма: 0

0
Разработчик
Ответов: 26066
Рейтинг: 2120
#57: 2014-01-23 22:58:31 ЛС | профиль | цитата
Poputchik писал(а):
Не подскажите с чем это может быть связано и есть ли спсобы борьбы с этим.

Без понятия почему так происходит. В нэте рыть надо
карма: 22

0
Ответов: 413
Рейтинг: 57
#58: 2014-01-25 14:23:52 ЛС | профиль | цитата
Возможно кому то тоже будет полезно.
Вычитал, что в rtf можно вставлять ссылки на изображения вместо вставки этого изображения внутрь файла. Попробовал - word понимает нормально.
{field
{*fldinst
{fs36 INCLUDEPICTURE "image.jpg" \* MERGEFORMAT \d }}
{fldrslt
{fs36lang1024 }}}

Недостаток в том, что, при необходимости перенести файл rtf на другой ПК, вместе с файлом rtf придется переносить и изображения, которые должны в нем отображаться.
карма: 0

0
Ответов: 2
Рейтинг: 0
#59: 2020-06-13 16:21:47 ЛС | профиль | цитата
Может у кого есть рабочая ссылка на компонент для работы с Word, который выкладывал Вячеслав 12 лет назад?
карма: 0

0
Ответов: 2059
Рейтинг: 131
#60: 2020-06-13 18:37:47 ЛС | профиль | цитата
Может у кого есть рабочая ссылка на компонент для работы с Word, который выкладывал Вячеслав 12 лет назад?

EVV, Круче сформулировать просто невозможно!
Откуда она возьмётся?
https://yadi.sk/d/PWKJj2oSk6N3JA

Редактировалось 6 раз(а), последний 2020-06-13 18:52:07
карма: 6

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)