Вверх ↑
Ответов: 413
Рейтинг: 57
#1: 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