Hi,
Following sos' suggestion, we tried to get Image Preferred DPI from file properties. We thought to use this value directly to draw bitmap. After asking the last question we found a sample in sfx2/source/dialog/dinfdlg.cxx to get this property value. So we added the following code to get the DPI:
/* get Image
Preferred DPI from File/Properties. User can specify DPI they
wanted
* to exported. */
SfxObjectShell* pDocSh = SfxObjectShell::Current();
sal_Int32 nImagePreferredDPI = 0;
if (pDocSh)
{
try
{
uno::Reference<
lang::XMultiServiceFactory > xFac( pDocSh->GetModel(),
uno::
UNO_QUERY_THROW );
uno::Reference<
beans::XPropertySet > xProps( xFac->createInstance("com.sun.
star.document.Settings"),
uno::UNO_QUERY_THROW );
xProps->getPropertyValue("ImagePreferredDPI") >>=
nImagePreferredDPI;
}
catch(
uno::Exception& )
{
}
}
then sent the nImagePreferredDPI to generate the bitmap. It worked! At least we can use designated DPI to get a better bitmap quality.
Then when we tried to patch it to latest libreoffice.core and compile it, it failed to link:
/usr/bin/ld:
/home/lodev/git/libreoffice.core/workdir/CxxObject/vcl/source/gdi/vectorgraphicdata.o:
in function
`convertPrimitive2DSequenceToBitmapEx(std::deque<com::sun::star::uno::Reference<com::sun::star::graphic::XPrimitive2D>,
std::allocator<com::sun::star::uno::Reference<com::sun::star::graphic::XPrimitive2D>
> > const&, basegfx::B2DRange const&, unsigned
int, o3tl::Length, std::optional<Size> const&)':
vectorgraphicdata.cxx:(.text+0x226d): undefined reference to
`SfxObjectShell::Current()'
/usr/bin/ld: vectorgraphicdata.cxx:(.text+0x228f): undefined
reference to `SfxObjectShell::GetModel() const'
collect2: error: ld returned 1 exit status
make[1]: ***
[/home/lodev/git/libreoffice.core/vcl/Library_vcl.mk:20:/home/lodev/git/libreoffice.core/instdir/program/libvcllo.so]
錯誤 1
We thought that the time we succeeded should be because the
related objects (sfx2) had been there when we tried, so it could
compiled and linked successfully. This time we did it from
starting so it failed because the object files were no longer
there, and we have no idea how to make sfx objects compile first.
So again we're stuck. We did prove the idea, using Image Preferred DPI to generate better bitmap, works. User can specify a bigger DPI there to get better bitmap resolutions after exporting to OOXML. Just that maybe we shouldn't use sfx object to get the property. But we have no idea how to get the property value since we're not very familiar with the reference things.
Would anyone please give a little help and hints here?
Thanks, Dev
Hi,
sos 於 2023/8/31 17:53 寫道:
Sorry to come back to this: every document has a property called "Image Preferred DPI" that can be used to represent the printing intentions of that document.
Apparent dimensions are a result of deviding the available pixels in the Image by the print intentions .
if the user like to send the document to a professional printing house then all images need to have a DPI of minimal 254, laser printers need 150 DPI and on screen presentations 96 DPI
Tomaz has this implemented a feature called "Image Preferred DPI" so the dimensions of an image in the document can been checked/controled by the number of pixels in the image and the print intentions off a document.
With a Preferred DPI of 254 and 2450 pixels in the image, the image can be displayed at a maximum size of 10 inches. If the image is smaller, then fewer than 2450 pixels are needed.
So the "Image Preferred DPI" can be used to determine the "Print Intentions" for a Document, and it can easily calculate how many DPI or pixels an image needs.
grtz
Fernand
Sorry for disturbing again, but we're not experienced enough.
Following your instruction, we thought about getting the "Image Preferred DPI" property and used it as aDPI when creating bitmaps. That way, at least user could try to assign a large DPI to get better resolution. However we failed to find out how to get it. We know it is in File-Properties and we know it is set in sfx2/source/dialog/dinfdlg.cxx,
xProps->setPropertyValue("ImagePreferredDPI", uno::Any(nImagePreferredDPI));
But we couldn't find out how to get this "ImagePreferredDPI" property value and use it in vcl/source/gdi/vectorgraphicdata.cxx. A little more help here please?
Dev