<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[EXIF- Daten und GDIPlus]]></title><description><![CDATA[<p>Ich habe folgendes Problem:</p>
<p>1. ich lese eine JPG (TIF) Datei ein mit GDIPlus und speichere ds in ein<br />
TBitmap - Ist OK<br />
2. Ich Speicher das Bild (Aus dem TBitmap) in eine JPG (TIF) Datei<br />
mit GDIPlius - Ist auch noch (fast) OK<br />
3. Ich lese die EXIF- Daten aus einer 2. JPG Datei aus und übertrage diese<br />
in das neue Bild - JPG- Objekt in der GDIPlus.</p>
<p>Hier liegt das Problem: scheinbar werden die EXIF Daten übertragen, die sind in der neuen Datei auch scheinbar enthalten.<br />
Aber einige Einträge werden beim nächsten Öffnen anders usgelesen.</p>
<p>Speziell die Daten zu ICC- Farbprofilen gehen irgendwie kaputt.<br />
Kennt jemand den Effekt?<br />
Kann einer den Fehler lokalisieren im folgenden Code?</p>
<pre><code class="language-cpp">// Diese Methode sucht die Class-ID eines Encoders (aus der MSDN Library)
//
int GetEncoderClsid(const WCHAR* format, CLSID* pClsid)
{
   UINT  num = 0;          // number of image encoders
   UINT  size = 0;         // size of the image encoder array in bytes

   ImageCodecInfo *pImageCodecInfo = NULL;

   GetImageEncodersSize(&amp;num, &amp;size);
   if(size == 0)
      return -1;  // Failure

   pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
   if(pImageCodecInfo == NULL)
      return -1;  // Failure

   GetImageEncoders(num, size, pImageCodecInfo);

   for(UINT j = 0; j &lt; num; ++j)
   {
      if( wcscmp(pImageCodecInfo[j].MimeType, format) == 0 )
      {
         *pClsid = pImageCodecInfo[j].Clsid;
         free(pImageCodecInfo);
         return j;  // Success
      }
   }

   free(pImageCodecInfo);
   return -1;  // Failure
}
//***********************************************************************

//Datei Speichern als &quot;AFile&quot;
//EXIF- Daten übertragen aus &quot;AFiledataFrom
// Alle Variablen zum Lese der zu übertragenden EXIF Daten haben im Namen &quot;DataFrom&quot;
// Das zu speichernde Bitmap- Bild liegt in Variabele FBitmap vor
void __fastcall TGDIPJPGImage::SaveToFile(AnsiString AFile,AnsiString AFileDataFrom)
{
  GdiplusStartupInput gdiplusStartupInput;
  Gdiplus::ULONG_PTR gdiplusToken;

  UINT sizeDataFrom=0;
  UINT countDataFrom=0;
  Bitmap* bitmapDataFrom=NULL;
  PropertyItem* pPropBufferDataFrom=NULL;

  Bitmap* bitmap;
  CLSID  clsid;
  EncoderParameters encoderParameters;
  PropertyItem* propertyItem;

  GdiplusStartup(&amp;gdiplusToken, &amp;gdiplusStartupInput, NULL);

//&quot;Alte&quot; Erweiterte daten lesen  **************************
  bitmapDataFrom = new Bitmap((WideString)AFileDataFrom);
  bitmapDataFrom-&gt;GetPropertySize(&amp;sizeDataFrom, &amp;countDataFrom);
  // GetAllPropertyItems returns an array of PropertyItem objects.
  // Allocate a buffer large enough to receive that array.
  pPropBufferDataFrom =(PropertyItem*)malloc(sizeDataFrom);
  // Get the array of PropertyItem objects.
  bitmapDataFrom-&gt;GetAllPropertyItems(sizeDataFrom, countDataFrom, pPropBufferDataFrom);
  delete bitmapDataFrom;
//&quot;Alte&quot; Erweiterte daten lesen ENDE **********************

  bitmap = new Bitmap(FBitmap-&gt;Handle,FBitmap-&gt;Palette);
//  propertyItem = new PropertyItem;

  GetEncoderClsid(L&quot;image/jpeg&quot;, &amp;clsid);

//&quot;Alte&quot; Erweiterte daten übernehmen **********************
  if (pPropBufferDataFrom!=NULL)
  {
    PropertyItem* propertyItem = new PropertyItem;
    for(UINT j = 0; j &lt; countDataFrom; ++j)
    {
      pPropBufferDataFrom[j].type=pPropBufferDataFrom[j].type;

      propertyItem-&gt;id = pPropBufferDataFrom[j].id;
      propertyItem-&gt;length = pPropBufferDataFrom[j].length;
      propertyItem-&gt;type = pPropBufferDataFrom[j].type;
      propertyItem-&gt;value = pPropBufferDataFrom[j].value;
      bitmap-&gt;SetPropertyItem(propertyItem);
    }

    delete propertyItem;
    free(pPropBufferDataFrom);
  }
//&quot;Alte&quot; Erweiterte daten übernehmen Ende *****************

  //EncoderQuality aus GDIPlus geht nicht!!! (???)
  //Ist in EXTGDIPLUS.H deklariert als: extern __EncoderQuality
  encoderParameters.Parameter[ 0 ].Guid = Gdiplus::_EncoderQuality;
  encoderParameters.Count = 1;
  encoderParameters.Parameter[ 0 ].Type = EncoderParameterValueTypeLong;
  encoderParameters.Parameter[ 0 ].NumberOfValues = 1;
  encoderParameters.Parameter[ 0 ].Value = &amp;FJPGQuality;
  bitmap-&gt;Save((WideString)AFile, &amp;clsid, &amp;encoderParameters);

  delete bitmap;
  GdiplusShutdown(gdiplusToken);
}
</code></pre>
<p>Wie gesagt, das Speichern klappt ganz gut, viele EXIF- daten sind auch wieder lesbar.</p>
<p>Aber einige Daten gehen kaputt - speziell vorhandene ICC- Farbprofile.<br />
Und genau die müssen erhalten bleiben</p>
<p>Thx<br />
Frank</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/198799/exif-daten-und-gdiplus</link><generator>RSS for Node</generator><lastBuildDate>Tue, 18 Aug 2026 18:47:05 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/198799.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 25 Nov 2007 20:40:47 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to EXIF- Daten und GDIPlus on Sun, 25 Nov 2007 20:40:47 GMT]]></title><description><![CDATA[<p>Ich habe folgendes Problem:</p>
<p>1. ich lese eine JPG (TIF) Datei ein mit GDIPlus und speichere ds in ein<br />
TBitmap - Ist OK<br />
2. Ich Speicher das Bild (Aus dem TBitmap) in eine JPG (TIF) Datei<br />
mit GDIPlius - Ist auch noch (fast) OK<br />
3. Ich lese die EXIF- Daten aus einer 2. JPG Datei aus und übertrage diese<br />
in das neue Bild - JPG- Objekt in der GDIPlus.</p>
<p>Hier liegt das Problem: scheinbar werden die EXIF Daten übertragen, die sind in der neuen Datei auch scheinbar enthalten.<br />
Aber einige Einträge werden beim nächsten Öffnen anders usgelesen.</p>
<p>Speziell die Daten zu ICC- Farbprofilen gehen irgendwie kaputt.<br />
Kennt jemand den Effekt?<br />
Kann einer den Fehler lokalisieren im folgenden Code?</p>
<pre><code class="language-cpp">// Diese Methode sucht die Class-ID eines Encoders (aus der MSDN Library)
//
int GetEncoderClsid(const WCHAR* format, CLSID* pClsid)
{
   UINT  num = 0;          // number of image encoders
   UINT  size = 0;         // size of the image encoder array in bytes

   ImageCodecInfo *pImageCodecInfo = NULL;

   GetImageEncodersSize(&amp;num, &amp;size);
   if(size == 0)
      return -1;  // Failure

   pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
   if(pImageCodecInfo == NULL)
      return -1;  // Failure

   GetImageEncoders(num, size, pImageCodecInfo);

   for(UINT j = 0; j &lt; num; ++j)
   {
      if( wcscmp(pImageCodecInfo[j].MimeType, format) == 0 )
      {
         *pClsid = pImageCodecInfo[j].Clsid;
         free(pImageCodecInfo);
         return j;  // Success
      }
   }

   free(pImageCodecInfo);
   return -1;  // Failure
}
//***********************************************************************

//Datei Speichern als &quot;AFile&quot;
//EXIF- Daten übertragen aus &quot;AFiledataFrom
// Alle Variablen zum Lese der zu übertragenden EXIF Daten haben im Namen &quot;DataFrom&quot;
// Das zu speichernde Bitmap- Bild liegt in Variabele FBitmap vor
void __fastcall TGDIPJPGImage::SaveToFile(AnsiString AFile,AnsiString AFileDataFrom)
{
  GdiplusStartupInput gdiplusStartupInput;
  Gdiplus::ULONG_PTR gdiplusToken;

  UINT sizeDataFrom=0;
  UINT countDataFrom=0;
  Bitmap* bitmapDataFrom=NULL;
  PropertyItem* pPropBufferDataFrom=NULL;

  Bitmap* bitmap;
  CLSID  clsid;
  EncoderParameters encoderParameters;
  PropertyItem* propertyItem;

  GdiplusStartup(&amp;gdiplusToken, &amp;gdiplusStartupInput, NULL);

//&quot;Alte&quot; Erweiterte daten lesen  **************************
  bitmapDataFrom = new Bitmap((WideString)AFileDataFrom);
  bitmapDataFrom-&gt;GetPropertySize(&amp;sizeDataFrom, &amp;countDataFrom);
  // GetAllPropertyItems returns an array of PropertyItem objects.
  // Allocate a buffer large enough to receive that array.
  pPropBufferDataFrom =(PropertyItem*)malloc(sizeDataFrom);
  // Get the array of PropertyItem objects.
  bitmapDataFrom-&gt;GetAllPropertyItems(sizeDataFrom, countDataFrom, pPropBufferDataFrom);
  delete bitmapDataFrom;
//&quot;Alte&quot; Erweiterte daten lesen ENDE **********************

  bitmap = new Bitmap(FBitmap-&gt;Handle,FBitmap-&gt;Palette);
//  propertyItem = new PropertyItem;

  GetEncoderClsid(L&quot;image/jpeg&quot;, &amp;clsid);

//&quot;Alte&quot; Erweiterte daten übernehmen **********************
  if (pPropBufferDataFrom!=NULL)
  {
    PropertyItem* propertyItem = new PropertyItem;
    for(UINT j = 0; j &lt; countDataFrom; ++j)
    {
      pPropBufferDataFrom[j].type=pPropBufferDataFrom[j].type;

      propertyItem-&gt;id = pPropBufferDataFrom[j].id;
      propertyItem-&gt;length = pPropBufferDataFrom[j].length;
      propertyItem-&gt;type = pPropBufferDataFrom[j].type;
      propertyItem-&gt;value = pPropBufferDataFrom[j].value;
      bitmap-&gt;SetPropertyItem(propertyItem);
    }

    delete propertyItem;
    free(pPropBufferDataFrom);
  }
//&quot;Alte&quot; Erweiterte daten übernehmen Ende *****************

  //EncoderQuality aus GDIPlus geht nicht!!! (???)
  //Ist in EXTGDIPLUS.H deklariert als: extern __EncoderQuality
  encoderParameters.Parameter[ 0 ].Guid = Gdiplus::_EncoderQuality;
  encoderParameters.Count = 1;
  encoderParameters.Parameter[ 0 ].Type = EncoderParameterValueTypeLong;
  encoderParameters.Parameter[ 0 ].NumberOfValues = 1;
  encoderParameters.Parameter[ 0 ].Value = &amp;FJPGQuality;
  bitmap-&gt;Save((WideString)AFile, &amp;clsid, &amp;encoderParameters);

  delete bitmap;
  GdiplusShutdown(gdiplusToken);
}
</code></pre>
<p>Wie gesagt, das Speichern klappt ganz gut, viele EXIF- daten sind auch wieder lesbar.</p>
<p>Aber einige Daten gehen kaputt - speziell vorhandene ICC- Farbprofile.<br />
Und genau die müssen erhalten bleiben</p>
<p>Thx<br />
Frank</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1410014</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1410014</guid><dc:creator><![CDATA[DerAltenburger]]></dc:creator><pubDate>Sun, 25 Nov 2007 20:40:47 GMT</pubDate></item><item><title><![CDATA[Reply to EXIF- Daten und GDIPlus on Sun, 25 Nov 2007 21:32:51 GMT]]></title><description><![CDATA[<p>Keine Ahnung ob es dir hilft.<br />
<a href="http://marquardtnet.info/cecke/quickies.1/1_index.html" rel="nofollow">http://marquardtnet.info/cecke/quickies.1/1_index.html</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1410040</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1410040</guid><dc:creator><![CDATA[chroniker]]></dc:creator><pubDate>Sun, 25 Nov 2007 21:32:51 GMT</pubDate></item></channel></rss>