In your original message, you said that "the resulting output.jpg differs in hex code from the reference image", which implied that you expected the entire images to be bitwise-identical.  That is an unrealistic expectation.  If, however, you meant that you expected the data between the SOI and SOS markers to be the same, then what you're actually trying to do is make the image *headers* bitwise-identical.  That is also an unrealistic expectation, unless the camera uses libjpeg-turbo.  Different codecs don't always write the headers in the same way.  If, however, what you're really trying to do is duplicate the level of JPEG compression that a camera uses, then using jpeg_copy_critical_parameters() (as your code already does) is the way to do that.

That's all the help I can provide.

On 6/29/23 1:09 AM, Hugh Shaw wrote:
I'm sorry for I did not express my current situation well enough for you to understand my intention: Images taken by a certain manufacturer's phone/camera have their own fixed compression algorithms. I hope to simulate these compression algorithms to generate my own images, whether they are input images or self-generated ones. This issue has been bothering me for a long time, and I have not been able to find a solution

在2023年6月29日星期四 UTC+8 05:20:05<Hugh Shaw> 写道:

    What if I rephrase the question: Is there a way for me to compress
    a plain red image using the same compression method as
    reference.jpg using libjpeg-turbo? The resulting red image should
    have the exact same hex code between FFD8 and FFDA as reference.jpg.

    在2023年6月29日星期四 UTC+8 04:56:28<DRC> 写道:

        Even if you use the identical compression method, there is no
        way to perfectly simulate a JPEG reference image unless you
        can obtain the original pixels that were used to generate the
        reference image.  The term "re-compress" means that you have
        to decompress first, so you will incur generational loss, as I
        mentioned below.  You can't perfectly duplicate the JPEG image
        data (the data after the SOS marker) from the metadata and
        decompressed pixels of a reference JPEG image.  You can
        perfectly duplicate the JPEG image data from the metadata of a
        reference JPEG image if you have access to the original pixels
        that were used to generate the reference image, but your
        messages imply that you don't.  That means that what you're
        trying to do is impossible.

        On 6/28/23 4:46 PM, Hugh Shaw wrote:

        I think you may have misunderstood my intention. What I hope
        to achieve is to compress an image using the same compression
        method as reference.jpg, perfectly simulating it. In my
        understanding, the hex code of a JPEG includes information
        such as DQT, SOF, and DHT. I wonder if I can use this
        information to re-compress an image and generate output.jpg.
        Theoretically, the hex code between FFD8 and FFDA should be
        identical in output.jpg and reference.jpg, and the
        compression data after SOS should also be calculated based on
        information such as DQT, SOF, and DHT. I hope to use
        libjpeg-turbo to implement this function. It seems that
        jpegtran cannot achieve this.



        在2023年6月29日星期四 UTC+8 04:19:58<DRC> 写道:

            I can only barely comprehend what you are trying to do or
            why, but unless the reference image is a lossless JPEG (I
            assume not, if it has a DQT), any
            decompression/compression cycle will result in
            generational loss.  Thus, you cannot exactly regenerate a
            lossy reference JPEG image unless you have the original
            uncompressed image that was used to generate the
            reference image in the first place. Once a JPEG image is
            generated, then some of that original data is lost.  The
            best you can do is copy the DCT blocks (in the frequency
            domain) from one JPEG container to another, which is what
            jpegtran does.  That avoids a decompression/recompression
            cycle and thus avoids generational loss, so the
            transformed JPEG image has no additional loss relative to
            the reference JPEG image. However, there are limits to
            what you can do in the frequency domain.  You can reorder
            the DCT blocks; spatially transpose, rotate, or flip the
            blocks; remove or change the order of some of the
            component planes (e.g. convert color to grayscale);
            negate the coefficients (photo negative); re-quantize the
            coefficients (lower the effective JPEG quality); change
            the entropy algorithm (e.g. convert baseline to
            progressive or arithmetic); add restart markers; crop the
            image (by discarding certain blocks); wipe an image
            region (by greying out certain blocks); drop another
            image into the source image (by replacing certain
            blocks); or remove metadata.

            On 6/28/23 3:59 PM, Hugh Shaw wrote:
            I have a specific requirement I need help with and hope
            to get assistance from experts in the field. I have
            learned that for the same compression algorithm, the
            compression fingerprints are consistent. This means that
            the data from FF D8 to just before the scan line FF DA
            are always identical. Based on this information, I would
            like to be able to duplicate the compression fingerprint
            of one image and apply it to another.

            Specifically, I need to accomplish two things:

            First, use the perfectly compressed fingerprint from
            reference.jpg to compress input.jpg and generate
            output.jpg. Second, make sure that the DQT, SOF, and DHT
            information in output.jpg is exactly the same (including
            hex codes) as in reference.jpg. I have already ensured
            that the pixel dimensions of input.jpg and reference.jpg
            are the same.

            I have attempted to code a solution, as shown below,
            which involves manually copying the quantization and
            Huffman tables, copying critical parameters, and
            applying the compression and decompression. However, the
            resulting output.jpg differs in hex code from the
            reference image, even though the dimensions are the same.

            /Due to lenght limitations, I can only include the code
            I tried in the attachment/

            I am unsure what the issue is and would appreciate any
            guidance in resolving this problem. Thank you.

            Looking forward to your reply!
            Best regards,
-- You received this message because you are subscribed to
            the Google Groups "libjpeg-turbo User
            Discussion/Support" group.
            To unsubscribe from this group and stop receiving emails
            from it, send an email to
            libjpeg-turbo-u...@googlegroups.com.
            To view this discussion on the web visit
            
https://groups.google.com/d/msgid/libjpeg-turbo-users/db388722-522d-40f7-b868-185684060ffan%40googlegroups.com
            
<https://groups.google.com/d/msgid/libjpeg-turbo-users/db388722-522d-40f7-b868-185684060ffan%40googlegroups.com?utm_medium=email&utm_source=footer>.

-- You received this message because you are subscribed to the
        Google Groups "libjpeg-turbo User Discussion/Support" group.
        To unsubscribe from this group and stop receiving emails from
        it, send an email to libjpeg-turbo-u...@googlegroups.com.
        To view this discussion on the web visit
        
https://groups.google.com/d/msgid/libjpeg-turbo-users/384ceb0a-e840-4bb9-b94c-1a613f965231n%40googlegroups.com
        
<https://groups.google.com/d/msgid/libjpeg-turbo-users/384ceb0a-e840-4bb9-b94c-1a613f965231n%40googlegroups.com?utm_medium=email&utm_source=footer>.

--
You received this message because you are subscribed to the Google Groups "libjpeg-turbo User Discussion/Support" group. To unsubscribe from this group and stop receiving emails from it, send an email to libjpeg-turbo-users+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/libjpeg-turbo-users/2616ce8b-c747-48e7-8c39-a3ee243b88edn%40googlegroups.com <https://groups.google.com/d/msgid/libjpeg-turbo-users/2616ce8b-c747-48e7-8c39-a3ee243b88edn%40googlegroups.com?utm_medium=email&utm_source=footer>.

--
You received this message because you are subscribed to the Google Groups 
"libjpeg-turbo User Discussion/Support" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to libjpeg-turbo-users+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/libjpeg-turbo-users/ada696c8-9273-a86a-928e-49aad9285a0c%40virtualgl.org.

Reply via email to