Thank you very much for giving me such a clear answer!! Now I understand that I shouldn't continue studying on libjpeg-turbo. At the same time, I would like to ask, if I want to achieve my goal, is there any way to do it? For example, what kind of library should I use or what should I learn?
Thank you again!! 在2023年6月29日星期四 UTC+8 22:07:25<DRC> 写道: > 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-u...@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/50c2216a-0461-4154-b66d-b6a48613e5b1n%40googlegroups.com.