Issue with TDBRichViewEdit and Image Dimensions in Markdown Mode

General TRichView support forum. Please post your questions here
Post Reply
a.mancini
Posts: 12
Joined: Tue Jan 16, 2024 3:35 pm

Issue with TDBRichViewEdit and Image Dimensions in Markdown Mode

Post by a.mancini »

Hello everyone,

I am encountering an issue while working with TDBRichViewEdit in Markdown mode.
I am loading images from the filesystem instead of saving them directly in Markdown as base64.
The problem arises when I resize the images in the editor and then save the changes. Upon reloading the element, the image dimensions always revert to those of the original image and not the ones I previously modified.

I have attempted to implement the SaveImage2 event to capture the new image dimensions, but the Graphic variable seems to consistently return the height and width of the original image.

My question is: how can I obtain the dimensions of the modified image or save the new dimensions in Markdown?

Any help or guidance on resolving this issue would be greatly appreciated.

Thank you,
Alessandro Mancini
standay
Posts: 261
Joined: Fri Jun 18, 2021 3:07 pm

Re: Issue with TDBRichViewEdit and Image Dimensions in Markdown Mode

Post by standay »

Sergey will know for sure but you may need to do something like this:

First, get the current image info into some vars:

Code: Select all

    rv.GetCurrentPictureInfo( s, gr, RVAlign, ATag );
    w := gr.Width;
    h := gr.Height;
Change your w and h, then set picture info with new values for height and width...

Code: Select all

    rv.SetCurrentPictureInfo( FFileName , gr, RVAlign, ATag );
    rv.Reformat;
I ran into something like this and that's what I had to do to get the image(s) to resize. If you want to do this by item number, just use rv.GetPictureInfo and rv.SetPictureInfo instead. This might not fit your circumstnace exactly but maybe it will help.

Stan
a.mancini
Posts: 12
Joined: Tue Jan 16, 2024 3:35 pm

Re: Issue with TDBRichViewEdit and Image Dimensions in Markdown Mode

Post by a.mancini »

Thank you for your reply,

But GetCurrentPictureInfo returns the same information (original width and height) as the OnSaveImage2 event.

Code: Select all

procedure TFormSintesi.EdtSintesiSaveImage2(Sender: TCustomRichView;
  Graphic: TGraphic; SaveFormat: TRVSaveFormat; const Path,
  ImagePrefix: TRVUnicodeString; var ImageSaveNo: Integer;
  var Location: TRVUnicodeString; var DoDefault: Boolean);
var LNewFileName : String;
    LOrigFilename: String;
    LItem        : TCustomRVItemInfo;
    LGr          : TGraphic;
    LItemName    : TRVUnicodeString;
    LTag         : TRVTag;
    LRvAlign     : TRVVAlign;
begin
  if SaveFormat <> rvsfMarkdown then exit;

  LItem               := Sender.RVData.GetItem(RVStyle1.ItemNo);
  LOrigFilename  := Format('%s%s',[IDisplayEditable.IGriglia.GetCachePathImage,LItem.Hint]);
  Location           := Format('%s_%d.%s', [ImagePrefix,ImageSaveNo, GraphicExtension(TGraphicClass(Graphic.ClassType))]);
  LNewFileName  := Format('%s%s',[IDisplayEditable.IGriglia.GetCachePathImage,Location]);
  inc(ImageSaveNo);

  {$REGION 'Log'}
  {TSI:IGNORE ON}
    LogModule.ScriviLog('TFormSintesi.EdtSintesiSaveImage2',Format('Temporany filename %s Original filename %s',[LNewFileName,LOrigFilename]),tpliv4,True);
  {TSI:IGNORE OFF}
  {$ENDREGION}
  
  EdtSintesi.GetCurrentPictureInfo( LItemName, LGr, LRvAlign, LTag );

  {$REGION 'Log'}
  {TSI:IGNORE ON}
    LogModule.ScriviLog('TFormSintesi.EdtSintesiSaveImage2',Format('ItemName [%s] Size by event [%d/%d] Size by editor [%d/%d]',[LItemName,Graphic.Width,Graphic.Height,LGr.Width,LGr.Height]),tpliv4,True);
  {TSI:IGNORE OFF}
  {$ENDREGION}
  
  Graphic.SaveToFile(LNewFileName);
  
  if not IDisplayEditable.IGriglia.AddImageSummary(LNewFileName,LOrigFilename) then 
  begin
    MessageBox(Handle, PChar(siLang_FormSintesi.GetTextOrDefault('IDS_S6' (* 'Errore in fase di salvataggio' *) )), PChar(STR_ERROR), MB_ICONERROR or MB_OK or MODALITY);    
    abort;
  end;

  Location  := LNewFileName;
  DoDefault := False;
end;
My question is: How can I retrieve the new width and height of an image that has been resized in the DbrichViewEdit?
standay
Posts: 261
Joined: Fri Jun 18, 2021 3:07 pm

Re: Issue with TDBRichViewEdit and Image Dimensions in Markdown Mode

Post by standay »

In my code, I set an extra integer property:

Code: Select all

  rv.SetCurrentItemExtraIntProperty(rvepImageWidth, CurWidth , True);
Then later I can get that property:

Code: Select all

  rv.GetItemExtraIntProperty(ItemNo, rvepImageWidth, i );
Then I can see the display width and actual width:

Code: Select all

  msg := msg + #13'Display/Actual Width: ' + i.ToString + '/' + gr.Width.ToString;
I'm using a regular rve and no database. But I found I had to save the info separately using the property. I'm not using markdown or a database so this may not apply to your need.

Stan
a.mancini
Posts: 12
Joined: Tue Jan 16, 2024 3:35 pm

Re: Issue with TDBRichViewEdit and Image Dimensions in Markdown Mode

Post by a.mancini »

when you apply rv.SetCurrentItemExtraIntProperty(rvepImageWidth, CurWidth , True); ?
and whats its CurWidth ?


thank you for yout support
Sergey Tkachenko
Site Admin
Posts: 17310
Joined: Sat Aug 27, 2005 10:28 am
Contact:

Re: Issue with TDBRichViewEdit and Image Dimensions in Markdown Mode

Post by Sergey Tkachenko »

Markdown does not have keywords for specifying image size, so yes, images will be reverted to the original size after reloading.

Yes, you can modify images on saving in OnSaveImage2.
This event has "hidden" parameters (Sender.Style.RVData and Sender.Style.ItemNo) that you can use to get the image size.

Code: Select all

var
  ImageWidth, ImageHeight: Integer;
  LRVData: TCustomRVData;
begin
  LRVData := TCustomRVData(Sender.Style.RVData);
  LRVData.GetItemExtraIntProperty(Sender.Style.ItemNo, rvepImageWidth, ImageWidth);
  LRVData.GetItemExtraIntProperty(Sender.Style.ItemNo, rvepImageHeight, ImageHeight);
  ImageWidth := Sender.Style.GetAsStandardPixels(ImageWidth);
  ImageHeight := Sender.Style.GetAsStandardPixels(ImageHeight);
  {
  Here you can use ImageWidth and ImageHeight. For unresized image, they are zero.
  }
end;
PS: as for *Current* methods, they work with the object at the caret position.
a.mancini
Posts: 12
Joined: Tue Jan 16, 2024 3:35 pm

Re: Issue with TDBRichViewEdit and Image Dimensions in Markdown Mode

Post by a.mancini »

Thank you very much for the reply! I really appreciate your help.
I also wanted to compliment you on the excellent library you have produced.
In my opinion, it is a must-have for Delphi.

Thank you again.
I'll try the tests tomorrow.
a.mancini
Posts: 12
Joined: Tue Jan 16, 2024 3:35 pm

Re: Issue with TDBRichViewEdit and Image Dimensions in Markdown Mode

Post by a.mancini »

Okay, it works perfectly

One other question about OnSaveImage2: Can it retrieve the name of the image? For example, if I have this ![image](<IMAGE_NAME.jpg>) can I retrieve 'IMAGE_NAME.jpg
Sergey Tkachenko
Site Admin
Posts: 17310
Joined: Sat Aug 27, 2005 10:28 am
Contact:

Re: Issue with TDBRichViewEdit and Image Dimensions in Markdown Mode

Post by Sergey Tkachenko »

If rvoAssignImageFileNames is not included in RichView.Options, then this file name is lost on loading.
If rvoAssignImageFileNames is included in RichView.Options, then this file name is stored in rvespImageFileName property.

In OnSaveImage2, you can get it as

Code: Select all

var
  ImageFileName: String;

RVData.GetItemExtraStrProperty(Sender.Style.ItemNo, rvespImageFileName, ImageFileName);
a.mancini
Posts: 12
Joined: Tue Jan 16, 2024 3:35 pm

Re: Issue with TDBRichViewEdit and Image Dimensions in Markdown Mode

Post by a.mancini »

ok thank you
Post Reply