JPEG Bilder die 2te
-
Ja, ist Quark.
Du brauchst überhaupt keinen Pointer und kannst einfach mit . auf die Member zugreifen.
Ein Pointer ist hier absolut überflüssig.
-
Nathan schrieb:
Ja, ist Quark.
Du brauchst überhaupt keinen Pointer und kannst einfach mit . auf die Member zugreifen.
Ein Pointer ist hier absolut überflüssig.Es geht gar nicht um den Pointer mehr! Das hab ich ja schon jetzt grade oft genug verstanden. Danke.
-
Schreib doch erstmal nen Loader für unkomprimierte TGA-Bilder.
Den Code kannst du praktisch zu 90% übernehmen und du hast nur minimal Zusatzarbeit gemacht, weißt aber wie die absoluten Basics von JPEG funktionieren.
-
@Enno:
Ach so, tschuldigung, habe dich falsch verstanden.
-
Ethon schrieb:
Schreib doch erstmal nen Loader für unkomprimierte TGA-Bilder.
Den Code kannst du praktisch zu 90% übernehmen und du hast nur minimal Zusatzarbeit gemacht, weißt aber wie die absoluten Basics von JPEG funktionieren.Hast du alles gelesen? Dann wüsstest du das ich das nicht machen will sondern gleich dabei bleibe.
Trotzdem danke für den Tipp ich weis das zu schätzen.Nathan schrieb:
@Enno:
Ach so, tschuldigung, habe dich falsch verstanden.Und die Anfänger müssen sich immer anhören das sie richtig lesen soll.

Ne ist ja kein Problem.
-
Enno schrieb:
Ethon schrieb:
Schreib doch erstmal nen Loader für unkomprimierte TGA-Bilder.
Den Code kannst du praktisch zu 90% übernehmen und du hast nur minimal Zusatzarbeit gemacht, weißt aber wie die absoluten Basics von JPEG funktionieren.Hast du alles gelesen? Dann wüsstest du das ich das nicht machen will sondern gleich dabei bleibe.
Trotzdem danke für den Tipp ich weis das zu schätzen.Das würde ich metaphorisch verpacken als "Ich baue kein Rad, sondern gleich ein Auto, das 4 Räder hat". Aber naja, dein Bier, viel Erfolg.

-
Danke
-
Hey Leute,
ich habe mich nun weiter durch gekämpft. Bin auch gut voran gekommen.
Meine Frage:
Muss man sich für verschiedene JPEG Bilder immer neue Quantisierungstabellen errechnen oder kann man dafür auch feste(also const) Tabellen nehmen?Ich meine sowas:
//luminocity quantanization table static const int lqt[64]{2, 1, 1, 2, 3, 5, 6, 7, 1, 1, 2, 2, 3, 7, 7, 7, 2, 2, 2, 3, 5, 7, 8, 7, 2, 2, 3, 3, 6, 10, 10, 7, 2, 3, 4, 7, 8, 13, 12, 9, 3, 4, 7, 8, 10, 12, 14, 11, 6, 8, 9, 10, 12, 15, 14, 12, 9, 11, 11, 12, 13, 12, 12, 12}; //chromaticity quantanization table static const int cqt[64]{2, 2, 3, 6, 12, 12, 12, 12, 2, 3, 3, 8, 12, 12, 12, 12, 3, 3, 7, 12, 12, 12, 12, 12, 6, 8, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12};
-
...
-
Swordfish schrieb:
Die ganze Kacke steht doch eh in CCITT/ITU T.81!?
Geile Antwort.
Das steht auch alles in meinem Buch! Antwort auf meine Frage ist das trotzdem nicht.
-
...
-
Ich hab da mal rein geluschert udn auf meine spezielle Frage keine Antwort gefunden. Darfst mir gerne verraten wo das steht.
-
Enno schrieb:
Ich hab da mal rein geluschert
Dir wurde hier wieder und wieder gesagt, dass du dich mit deinem Projekt vollkommen übernimmst. Du hast wieder und wieder versichert, dass du dich unbedingt durchbeißen möchtest. Und jetzt bist du zu unkonzentriert/faul, die grundlegende Beschreibung des Formates gründlich durchzulesen?
Ich weiß wirklich nicht, wie man dir noch helfen soll...
-
...
-
Swordfish schrieb:
Enno schrieb:
Darfst mir gerne verraten wo das steht.
Das ist aber überaus gnädig von dir!
CCITT/ITU T.81, p. 15 schrieb:
[...] No default values for quantization tables are specified in this Specification; applications may specify values which customize picture quality for their particular image characteristics, display devices, and viewing conditions. [...]
// edit: Bevor du jetzt auf die Idee kommst zu Fragen, wo du die Quantization tables denn nun herzaubern sollst: Section B.2.4.1: Quantization table-specification syntax, ebendort.
Danke genau das wollte ich wissen.
Aber wie ich an die DQT komme weiß ich danke.
Geht bei FFDB los, nächsten 4 Zeichen geben die Länge, nächstes Zeichen die Genauigkeit der Werte, das nächste Zeichen die Tabellen Nr. und die dadrauf folgenden 64 Bytes sind dann im ZigZag die Tabelle. (wenn die Länge 67 ist
) 
-
...
-
Nein das war der Hammer der immer gegen meine Kopf geschlagen hat!!!

Aber so konnte mir das hier auch keiner sagen.
P.S.: Ich steck da jetzt voll drin muss das jetzt nur noch in Code umsetzten das wird auf jeden fall noch dauern.

-
So ich hab hier jetzt mal was geschrieben und würde einfach gerne mal hören ob ihr das so gut findet!
Das mit dem new hab ich so weil das in allen Projekten so drin ist. Da würde ich gerne nicht drüber diskutieren.
Ansonsten würde ich gerne wissen ob ihr versteht was ich da mache.DQT.h
#include <iostream> #include "marker.h" class DQT{ public: ZigZag(); ~ZigZag(); void getPointer(); void buildQT(const char* dqt, int dqtcount); private: Marker *marker; int quantTable[0][64]; };DQT.cpp
#include <iostream> #include <vector> #include "DQT.h" DQT::DQT(){ marker = new Marker(); //Aus der Klasse Marker bekomme ich die Pointer auf die stelle FFDB } DQT::~DQT(){ delete marker; } /* * function to get pointer to quantization table */ void DQT::getPointer(){ int dqtcount = marker->getDQTcount(); for(int i=0; i<=dqtcount; i++){ marker->setDQTcounter(i); const char* dqt = marker->getDQT(); if(!dqt) return; DQT::buildQT(dqt+5); } } /* * function to build quantisation table */ void DQT::buildQT(const char* dqt, int dqtcount){ bool up = true; char buf; int count = 0; for(int i=0; i<8; i++){ if(up){ for(int j=0; j<=i; j++){ buf = (char)dqt[8 * (i - j) + j]; quantTable[dqtcount][count++] = buf; } }else{ for(int j=i; j>=0; j--){ buf = (char)dqt[8 * (i - j) + j]; quantTable[dqtcount][count++] = buf; } } up = !up; } for(int i=7; i>=0; i--){ if(up){ for(int j=0; j<i; j++){ buf = (char)dqt[8 * (7 - j) + 8 - i + j]; quantTable[dqtcount][count++] = buf; } }else{ for(int j=0; j<i; j++){ buf = (char)dqt[8 * (8 - i + j) + 7 - j]; quantTable[dqtcount][count++] = buf; } } up=!up; } }
-
Enno schrieb:
Das mit dem new hab ich so weil das in allen Projekten so drin ist. Da würde ich gerne nicht drüber diskutieren.

Dann brauchst du hier nicht zu fragen. Das new und wie du es benutzt ist ein ganz gravierender Mangel an deinem Code.
#include <iostream> #include "marker.h" class DQT{ public: void getPointer(); void buildQT(const char* dqt, int dqtcount); private: Marker marker; int quantTable[0][64]; };#include <iostream> #include <vector> #include "DQT.h" /* * function to get pointer to quantization table */ void DQT::getPointer(){ int dqtcount = marker.getDQTcount(); for(int i=0; i<=dqtcount; i++){ marker.setDQTcounter(i); const char* dqt = marker.getDQT(); if(!dqt) return; DQT::buildQT(dqt+5); } } /* * function to build quantisation table */ void DQT::buildQT(const char* dqt, int dqtcount){ bool up = true; char buf; int count = 0; for(int i=0; i<8; i++){ if(up){ for(int j=0; j<=i; j++){ buf = (char)dqt[8 * (i - j) + j]; quantTable[dqtcount][count++] = buf; } }else{ for(int j=i; j>=0; j--){ buf = (char)dqt[8 * (i - j) + j]; quantTable[dqtcount][count++] = buf; } } up = !up; } for(int i=7; i>=0; i--){ if(up){ for(int j=0; j<i; j++){ buf = (char)dqt[8 * (7 - j) + 8 - i + j]; quantTable[dqtcount][count++] = buf; } }else{ for(int j=0; j<i; j++){ buf = (char)dqt[8 * (8 - i + j) + 7 - j]; quantTable[dqtcount][count++] = buf; } } up=!up; } }Bamm! Ich habe nur Code entfernt und das Ergebnis ist tausendfach besser als das was da vorher stand.
edit: Noch eine Runde Codeentfernung, die das Ergebnis nochmal tausendmal besser macht:
/* * function to build quantisation table */ void DQT::buildQT(const char* dqt, int dqtcount){ bool up = true; char buf; int count = 0; for(int i=0; i<8; i++){ if(up){ for(int j=0; j<=i; j++){ buf = dqt[8 * (i - j) + j]; quantTable[dqtcount][count++] = buf; } }else{ for(int j=i; j>=0; j--){ buf = dqt[8 * (i - j) + j]; quantTable[dqtcount][count++] = buf; } } up = !up; } for(int i=7; i>=0; i--){ if(up){ for(int j=0; j<i; j++){ buf = dqt[8 * (7 - j) + 8 - i + j]; quantTable[dqtcount][count++] = buf; } }else{ for(int j=0; j<i; j++){ buf = dqt[8 * (8 - i + j) + 7 - j]; quantTable[dqtcount][count++] = buf; } } up=!up; } }Schon Faktor eine Million. Noch eine Runde:
/* * function to build quantisation table */ void DQT::buildQT(const char* dqt, int dqtcount){ bool up = true; int count = 0; for(int i=0; i<8; i++){ if(up){ for(int j=0; j<=i; j++){ quantTable[dqtcount][count++] = dqt[8 * (i - j) + j]; } }else{ for(int j=i; j>=0; j--){ quantTable[dqtcount][count++] = dqt[8 * (i - j) + j]; } } up = !up; } for(int i=7; i>=0; i--){ if(up){ for(int j=0; j<i; j++){ quantTable[dqtcount][count++] = dqt[8 * (7 - j) + 8 - i + j]; } }else{ for(int j=0; j<i; j++){ quantTable[dqtcount][count++] = dqt[8 * (8 - i + j) + 7 - j]; } } up=!up; } }Was macht eigentlich get_Pointer? Da wird gar nichts ge-get-et. Das up könntest du dir übrigens auch sparen, aber ich sehe ein, dass es dann eventuell unübersichtlich wird. Ist das eigentlich richtig, dass die beiden Member unabhängig und frei aufrufbar sind? Das klingt doch stark danach, als sollten die beiden private sein und vom Konstruktor aufgerufen werden.
-
Ich kenne mich mit dem JPG-Komprimierungsverfahren nciht aus, kann daher inhaltlich nicht wirklich viel sagen. So ein paar Anmerkungen zum Code allgemein:
* marker.h brauchst du im Header nicht, da reicht eine Vorwärtsdeklaration (ein Vorteil durch die Pointer-Implementierung)
* "getPointer" ist sehr ungünstig gewählt. "get" impliziert, dass es sich um einen Getter handelt. "Pointer" ist auch nicht sonderlich aussagekräftig.
* Anstelle von "int quantTable[0][64]" als rohes array zumindest std::array.
* Den Aufruf von marker->setDQTcounter(i) würde ich nicht separat machen, sondern das i an marker->getDQT() übergeben: marker->getDQT(i) - sofern diese Methoden nicht anderweitig ncoh verwendet werden.
* Der Rückgabewert von marker->getDQT() erscheint mir auch ein wenig fragwürdig. Würde ich auch eine Lösung der STL vorziehen.
* Der Aufruf DQT::buildQT(dqt+5); wird nicht kompilieren, da ein Argument zu wenig. Außerdem brauchst du das "DQT::" nicht.
* in buildQT sind mir zu viele magic numbers drin, besser durch lesbare Konstanten ersetzen