Pixel in Bilddatei bearbeiten?



  • Hi,

    Ich möchte aus einer JPG-Datei die einzelnen Pixelwerte (für jeden Farbkanal) in ein Array einlesen. Am Ende soll nach einer Bearbeitung der Pixelwerte wieder eine Bilddatei ausgegeben werden.

    Vielleicht kann mir ja jemand ein Tipp geben wie man das Einlesen bewerkstelligen kann.



  • Ähm, die Datei über die MFC CImage oder GDI+ Image Klasse laden, bearbeiten und wieder speichern.
    http://msdn.microsoft.com/de-de/library/d06f3fhw(v=vs.80).aspx
    http://msdn.microsoft.com/en-us/library/windows/desktop/ms535407(v=vs.85).aspx



  • Hi

    du hast unter Windows die schöne Ole Function die
    verschiedene Formate lädt, nur zu empfehlen.

    Konzept sieht so aus:

    bool CDib::Load(LPCSTR fileName)
    {
       FILE   *fp(0);
       DWORD   fs(0);
    
       m_filename.Empty();
    
       if(!(fs=GetFileInfo(fileName)))
       {
    	   /*
    	   CVersions::DbgMsg(false,"warning: Dib:Load %s dosnt exist try get source from clipboard\n",fileName);
    
    	   if(!GetClipboard())
    	   {   
    		HBITMAP hbmp = (HBITMAP)::LoadImage (AfxGetInstanceHandle(),
    		MAKEINTRESOURCE(NULL), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION);
    
    		if(hbmp)
    		{
    			CDib::Draw(hbmp); 
    			::DeleteObject(hbmp);
    			return CVersions::DbgMsg(true,"info: Dib:Load have found clipboard image\n");
    		}
    	   }*/
    
    	   return CVersions::DbgMsg(true,"warning: Dib:Load %s dont exists\n",fileName);
       }
    
       // Read file in memory
       fp = fopen(fileName,"rb");
       if(!fp) 
    	return CVersions::DbgMsg(false,"error: Dib:Load %s cant open file\n",fileName);
    
       BYTE *pMem  = new BYTE[fs];
       if(!pMem)
        return CVersions::DbgMsg(false,"error: Dib:Load cant alloc file bufferd[%d]\n",fs);
    
       fread(pMem,1,fs,fp);
       fclose(fp);
    
       if(!StreamToPic(pMem,fs))
       {
        delete pMem;
        return CVersions::DbgMsg(false,"error: Dib:Load StreamToPic\n");
       }
    
       delete pMem;
    
       m_filename = fileName;
    
       return true;
    }
    
    bool CDib::StreamToPic(BYTE *pMem, int Size, bool Flip/*=false*/)
    {
       // Use IPicture stuff to use JPG / GIF files
       IPicture* pPicture = 0;
       IStream* pStream   = 0;
       LPBYTE   hG        = 0;
    
       DWORD fs = Size;
       hG = (LPBYTE) HeapAlloc( GetProcessHeap(), HEAP_GENERATE_EXCEPTIONS, fs);
       if(!hG)
        return CVersions::DbgMsg(false,"error: Dib:StreamToPic cant alloc processheap for image stream\n");
    
       memcpy(hG,pMem,fs);
    
       HRESULT hRes = ::CreateStreamOnHGlobal(hG,false,&pStream);// Create an IStream so IPicture can 
       if(hRes != S_OK)
       {
        HeapFree(GetProcessHeap(), 0, hG);
        return CVersions::DbgMsg(false,"error: Dib:StreamToPic cant CreateStreamOnHGlobal\n");
       }
    
       hRes = ::OleLoadPicture(pStream,fs,TRUE,IID_IPicture,(void**)&pPicture);
    
       if(hRes != S_OK)
       {
    	  pStream->Release();
          HeapFree(GetProcessHeap(), 0, hG);
          return CVersions::DbgMsg(false,"error: Dib:StreamToPic cant OleLoadPicture\n");
       }
    
       short type;pPicture->get_Type(&type);
       if(type == PICTYPE_BITMAP)
       {
    		HBITMAP hBmp = 0;
    		hRes = pPicture->get_Handle( (OLE_HANDLE* )&hBmp);//Retrive GDI Object 
    
    		if(hRes == S_OK)
    		 CDib::Draw(hBmp,Flip);
    		else CVersions::DbgMsg(false,"error: Dib:StreamToPic get_Handle\n");
    
    		if(hBmp)
             ::DeleteObject(hBmp);
       }
    
       if(pStream)
        pStream->Release();
    
       if(hG)
    	  HeapFree(GetProcessHeap(), 0, hG);
    
       if(pPicture)
        pPicture->Release();
    
       return (hRes == S_OK);
    }
    

    Hast Du erst den Handel auf die Bitmap, kannst du auf die
    Pixeldaten wie folgt zugreifen:

    CDib::Draw(hBmp,Flip)
     {
      BITMAP bitmap;
    
      if(!::GetObject ((HBITMAP)hBmp, sizeof (bitmap), &bitmap))
    	return false;
    
      if(!bitmap.bmBits)  <-- your Pixels here
        return false;
    
      ..... 
     }
    


  • kahn: Warum kopierst du den Puffer in StreamToPic, du kannst doch gleich SHCreateMemStream anwenden.

    Außerdem, manuelle Speicherverwaltung (auch noch falsch angewendet) in C++, hmm.

    Und ferner würde ich die Größe und sonstige Informationen gleich als Member in der Klasse ablegen, damit nicht bei jedem Zeichenvorgang noch GetObject bemüht werden muss..



  • na was bist denn Du für ein Schreibvogel, solltest lieber auf die Frage hier antworten, als son Stuss zu jammern..



  • Danke,
    ich glaube das sollte mir weiterhelfen.



  • @kahn
    @xor



  • kahn schrieb:

    na was bist denn Du für ein Schreibvogel, solltest lieber auf die Frage hier antworten, als son Stuss zu jammern..

    Er hat deine Antwort fuer schlecht befunden und korrigiert, damit Fehler nicht uebernommen werden. Das ist gut, auch wenn es an deinem Ego kratzt.



  • Wie in der klappse mit euch, olepic kann nur mit memstreams oder globalmems arbeiten, andere Schichten möchten das nicht, also wird hier was umkopiert,
    darum geht es doch nicht, das ist ein Pseudo -Code, hier ist zu sehen wie man
    konfirm ein jpg lädt mit Windows, das ist so garnicht kompilierber, und das ist gut so, hier wird durch Wichtigmacherei versucht schwule Zuneigung zu Erlangen.



  • Wenn du es hier so schrecklich findest, dann poste doch hier nicht.
    Ich finde es schrecklich wenn immer so viel furchtbar mieser "Beispielcode" gepostet wird. Weil Beispielcode halt Beispielwirkung hat - "aha, so macht man das also".
    Die meisten Leute die Fragen stellen die so einfach zu ergoogeln sind sind Anfänger, und die übernehmen dann die ganzen grauenhaften Dinge die dein "Beispielcode" so macht - weil sie nicht immer wissen wie man es sauber machen könnte/würde.

    Und ich glaube auch nicht dass es "Beispielcode" ist. Der Code stammt garantiert copy-paste aus einem bestehenden Projekt, wo er in all seiner Schrecklichkeit vor sich hin existiert.


  • Mod

    @hustbaer: +1



  • Da siehste Du ,

    Kotzbär hat ein Arschkrich -Punkt erlangt beim Ober Besserwiss..

    Ich lach mich krumm hier, das kann doch nicht wahr sein....



  • Deine Ausdrucksweise passt zu deinem Code.



  • Dann erzähl mal vom Code , denn dazu steht hier garnichts, was mich doch wundert, -schlüssel doch mal auf was da genau ist.

    Und erzähl doch mal warum nun genau damit kein jpg geladen werden kann , sonnst wissen doch jetzt deine irritierten Leser gar nicht was genau auf dem Punkt da nun ist, was ein jpg laden in weite ferne rücken lassen würde.


  • Mod

    @kahn: Mäßige Deinen Ton. Das ist die zweite Warnung innerhalb ein paar Tagen.

    Ansonsten solltest Du lesen:
    Es geht nicht darum, dass Dein nicht funktioniert. Er ist nach mehrfacher Meinung (auch meiner) einfach grauslich.



  • Sinnlose Ansage abgelehnt, ich denke nicht das hier objektiv vorgegangen wird, sondern kollektiv mit rudelverhalten und liebespunkten, ich distanziere mich und habe bereits die Löschung veranlasst, viel Spass mit den Managed Daten/Code
    verdreher...

    (ich kann mich glücklicherweise anderswo referenzieren, wo die hohen Ablaufgeschwindigkeiten die ich erzeuge geschätzt werden, und es kam niemals vor das etwas abstürzte und das ohne Exceptionhandling..

    Ich möchte auch noch den Dritten Punkt haben Martin. ich sag mal haarig Fotz..

    zu Dir 🙂


  • Mod

    Ich habe Dich gewarnt... 😞


  • Mod

    OT: ... und ein Member wieder weniger ...



  • 👍


Log in to reply