[Interest] [Development] Imageformats v2

André Somers andre at familiesomers.nl
Wed May 20 13:33:11 CEST 2015


Иван Комиссаров schreef op 20-5-2015 om 11:06:
>
>
> 2015-05-20 10:05 GMT+03:00 André Somers <andre at familiesomers.nl 
> <mailto:andre at familiesomers.nl>>:
>
>     Иван Комиссаров schreef op 19-5-2015 om 19:43:
>
>     ImageDocument doesn't need to inherit QObject in order to listen
>     to QIODevice signals of course. First of all, it could have rather
>     than be a QObject, and second of all you can connect to almost
>     anything callable nowadays. I'm not saying that being a QObject is
>     a bad thing per se, just that your argument for it isn't all that
>     convincing to me.
>
>     Are you sure a QString as an error() is the best choice? There are
>     other places in the Qt API where an enum is used instead. I think
>     an enum would probably be a better choice: it is easier to deal
>     with in errorhanding (no string comparisons needed; localization
>     issues).
>
>
> Please, provide me an example how to handle QImageReader::DeviceError, 
> QImageReader::UnsupportedFormatError or QImageReader::InvalidDataError.
Show different error messages for instance. Invalid data points to a 
corrupted file. That is not the same as just not recognizing the file 
format or having a network connection break in the middle of reading.
>
>     Would it then not be better to be explicit about this, and just
>     call it like that: bool readHeader()? I don't think it is a good
>     idea to try to emulate the QIODevice API for something that isn't
>     one. It is just confusing IMHO. What happens if the ImageDocument
>     can, but the underlying QIODevice cannot write?
>
>
> What happens if user forgot to call to readHeader()? In case document 
> is not opened, it's quite easy - we reject any further operations. For 
> now, open() checks open flags of the device and tries to reopen device 
> in write mode if necessary. It fails if device cannot be opened.
Perhaps it should just read the header directly when opening from 
file/iodevice and have an isValid() method or something like that?

>
>     So what does it actually do?
>
>
> Nothing for now:) But it can write end markers of the file and close 
> the device.
Not sure if that is a good idea. If you didn't open the device, you 
should not close it.

>>     capabilities() method returns capabilities (yep) of a format, see
>>     CapabilityFlag enum.
>     Hmm? The capabilities of the document? Don't the capabilities
>     belong to the format instead? Judging from the API you have
>     presented so far, I got the impression that an ImageDocument could
>     represent image containers in any format. Now, it seems like the
>     capabilities of the format are leaking into the document. How do
>     you construct a document from scratch then? Where do the
>     capabilities come from? Can I use ImageDocument to convert between
>     two different formats?
>
>
> So, do you suggest move those options to ImageIoHandler? I don't think 
> this is good idea. Right now, users are forced to use "private" class 
> QImageIOHandler only for option flags enum. I think, that class should 
> be used only to create new handlers and typical user of a Document 
> shouldn't know about it.
Fair enough. But that means that an ImageDocument should have a clear 
type at any time. That means you either create it with that type, get 
the type from the image you are reading, or convert to that type.

> Typicall usecase is - open document for writing, check what 
> capabilities are present and add resources to the document. But you 
> can add various resources first, then open for writing and call write().
Well, you can if you know the capabilities of the file you want to 
create, I'd say. I don't think I would allow adding resources to a file 
if the format can't support those resources.

> Yes, this is possible to resave document in the other format, hanlder 
> just should drop anything it doesn't support. We have no mipmap 
> support - ok, we just save first mipmap. We have no volume texture 
> support - ok, just save first slice.
> There should be an API that will allow to access those "default" images.
Thinking about this, I think I'd make the conversion explicit. If you 
loaded a multipage TIFF and want to save as a normal PNG, you could 
either have a void convert(QMimeType type) that converts the current 
document to the new value (dropping unsupported features in the process) 
and/or have a ImageDocument converted(QMimeType type) function that 
creates a new ImageDocument in the requested format based on the current 
document. Then, save _that_ document.

Perhaps you/the user/the file format plugin could even offer different 
options of how to deal with the degradation. Layers might be flattened 
to a single image, meta data from a specific image stored in the main 
meta data or vise versa, pages glued together to form a single image...

>     I am wondering if this is really the right slicing of the possible
>     contents. Pages were already mentioned before. Do you really need
>     to be able to have the document represent a 2D array of vectors of
>     images (in case you are using frames, mipmaps with volumne
>     textures)? Are there image formats like that that we need to
>     support in Qt? It also results in an overly complicated setup for
>     the simple use cases I think.
>
>
> That's the best way i found.
> For the simple usecase, there can be Document::image() method that 
> simply returns a "default" image (of mipmap 0, frame/page 0, slice 0).
>
>
>     Might it not be better to have ImageDocument contain a collection
>     of QImages directly, that can have different kinds of
>     relationships with each other and that you can somehow query for
>     if you need to?
>
>
> I was thinking about that. DDS can have up to 
> mipmapCount*frameCount*6. How do you suppose to get all sides for 
> frame 10, mipmap 5?
With something like document.images().frame(10).mipmap(5)? That would 
result in a list of 6 images for the requested frame and mipmap.

If images() returns a QVector<QImage>, you could use the same trick as 
used in QByteArrayList to add some special filtering methods on it 
without actually subclassing QVector<QImage>.

frame() and mipmap() (and side() and page() and layer() and whatever 
else one might come up with) could act as filtering functions that again 
return a list of images that has these methods.

> There was an idea to store mipmap/frame/side in ImageMeta::options and 
> to use something like document->filterResources(options). But there 
> are problems - i already have Document::meta. I can write something 
> like doc->meta.setOption(Side, PositiveX), but this makes little 
> sense, API is confusing.
Well, I don't know how your Meta things work of course, so I cannot 
comment on that. To me it makes little sense to set a meta property that 
belongs to a specific image on a document directly, but that may be my 
misunderstanding of your design.
>
>
>     For an application I am working on at work, I actually wrote a
>     document class a bit like that. The document contains a series of
>     images: images made of the left or right eye, from different
>     angles, in different wave lengths (IR, green laser, color - and
>     these are actually really different types of images!) in any
>     combination. The set can contain any of these, but need not
>     contain all. We keep them all in a single ImageCollection that you
>     can simply query for things like "which eyes occur in the set" but
>     also filter back using a method filtered() with overloads for all
>     the different dimentions we have, returning just another image
>     collection. Perhaps ImageDocument could work in a similar way to
>     collapse pages, frames, layers and mipmaps into?
>
>
> Too complex indexation.
I think it is actually simpler than forcing a 2D array onto image 
document formats that don't benefit from it.

> How do i supposed to control that EACH mipmap have the same number of 
> frames as document->frameCount(). I didn't find suitable solution.
Why would you need to control that? If an image format requires it, then 
that image format should impose that limit (or even auto-create the 
missing ones?) but I don't see why it should be a general limi Perhaps 
there are formats where it is possible that one page has a mipmap, while 
others don't? Just the first page for instance to provide a quick preview?

André

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/interest/attachments/20150520/4ca2ef87/attachment.html>


More information about the Interest mailing list