Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Mär 29, 2024 00:49

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 26 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Autor Nachricht
 Betreff des Beitrags: Re: JPG und Alpha
BeitragVerfasst: Do Sep 10, 2015 11:07 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2621
Wohnort: Berlin
Programmiersprache: Go, C/C++
OpenglerF hat geschrieben:
Vorhin hast du geschrieben habe bezog sich vor allen Dingen auf dieser Aussage von dir:
Zitat:
entpackgeschwindigkeit ist stark von der Lib abhängig aber PNG ist immer hoch im Kurs in einigen Fällen JPEG2k und JPEG ist das Schlusslicht.

Ich interpretiere das so:
Entpackgeschwindigkeit PNG > Entpackgeschwindigkeit JPEG2000 > Entpackgeschwindigkeit JPEG

Tatsächlich ist es aber so:
Entpackgeschwindigkeit JPEG > Entpackgeschwindigkeit PNG ≫ Entpackgeschwindigkeit JPEG2000

Es mag sein, dass es anders ist wenn man sich einen JPEG Dekoder mit aktivierter Handbremse aussucht. Allerdings gehe ich mal davon aus, dass das eher vermeidet (auch der Browserhersteller). Und es kann auch sein, dass zum Beispiel Snappy und TextureCrunch eine schöne Alternative mit entfernt verwandten Ideen sein könnten, allerdings haben die mit PNG und JPEG2000 erstmal ziemlich wenig zu tun, weil das so genannte Format nunmal anders definiert ist.

Ich hab beim suchen nach Benchmarkvergleichen zwischen PNG und JPEG noch ein weiteres Format gefunden. JPEG XR.
Das kommt von MS und ist Patentfrei und liegt in der quali, kompressionsrate und einfachheit zwischen jpeg und jpeg2k.
Hier der Artikel wo ich drüber gestolpert bin.

Zum PNG, ich hab mich mal durch die erste Seite von Google Treffern gegoogelt und die Dekompression von PNG wird zunehmend mit der steigenden Auflösung schneller, wo JPEG ziemlich konstant ist.
Beide waren z.B. ab 500er Auflösung gleich schnell bei iPhone.
Was ich recht häufig gesehen hab, ist das Leute PNG mit Jpeg < 100% verglichen haben, was natürlich Äpfel mit Birnen vergleichen ist.
PNG ist verlustfrei, es dann mit verlustbehafteten Formaten zu vergleichen ist nicht Zielführend, weil wenn ich abstriche bei der Qualität machen kann, dann ist PNG sowieso keine Wahl.
Deswegen mag einige Algos von JPEG2k so sehr, weil die bei gleichem PSNR Wert deutlich kleiner sind.

Etwas was wir z.B. garnicht angesprochen haben ist der Einfluss von der Art des Bildes in die Performance.
Je weniger Rauschen im Bild ist, des so schneller wird z.B. PNG gegenüber JPEG, je höher die Auflösung wird des so besser greift die Block Kompression von JPEG auf Mehrkern Machienen und wird schneller.
Die Benchmarks sind alle so stark unterschiedlich und in der Regel nicht annähernd auf der von den Libs angegebenen Theoretischen Geschwindigkeit.

Ich will definitiv keines der Format nutzen, die sind alle so brechend langsam beim dekompremieren, das die Total ungeeignet für Spiele sind.
Die Zahlen sind ein absolutes no go für Spiele, beim Browsen oder anderen nicht Zeitkritischen dingen ist es eine ganz andere Geschichte.

Ich plane und versuche beim Laden von Modellen und Texturen eigentlich mehr im <1ms Bereich zu kommen und nicht 50-1000ms.
Deswegen auch der kleine Exkurs mit den Virtuellen File System, weil das immer ne Handbremse ist.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: JPG und Alpha
BeitragVerfasst: Do Sep 10, 2015 14:45 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
Nu mal abgesehen davon muss man sich hier nicht so einen abbrechen. Es gibt ganz klare Anwendungsfälle für Desktop, Mobile, Web und Games welches Format wann
gut ist. Oder will hier tatsächlich jemand ein GUI mit JPG bauen und Fotos als GIF speichern? Quake 2 hat für solche Leute noch eine Funktion zum Mipmap generieren!

Der einzige Fall wo das noch nicht wirklich klar aus meiner Sicht ist, wäre WebGL. Da würde ich aber stark auf PNG tippen, weil man dort mehrere Texturen in ein Bild bekommst
und so Request spart. Habs aber noch nie ausprobiert.

Achja, und bei Mobil ist PNG > JPG. Freundliche Anleitung usw.

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: JPG und Alpha
BeitragVerfasst: So Sep 13, 2015 18:16 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Zitat:
Wenn man bei PNG Platzsparen will, kann ich übrigens IrfanView empfehlen.

Somit könnte man die JPGs in PNG umwandeln, somit hätte ich ein einheitliches Format.

Oder ist dies nicht zu empfehlen ?

So wie es aussieht, gibt es IrfanView nicht für Linux. :cry:

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: JPG und Alpha
BeitragVerfasst: Mo Sep 14, 2015 07:50 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
Nun nimm doch einfach ImageMagick. Das kannst du Problemlos in dein Buildscript einbauen. Oder du schnappst dir halt Mono oder .NET.
Dann kannst du dir mit C# schnell ein kleines Konsolenprogramm zusammenbauen (5 Minuten). Gibt bestimmt sowas wie FromFile
und dann Save als Methoden für die Bitmap Klasse.

Ich würde aber davon abraten jpg nach png umzuwandeln. JPG erzeugt ja beim komprimieren diverse Artefakte (Verluste) auf die PNG nicht so gut
klarkommt. Du bekommst dabei in der Regel ein Bild mit der gleichen Qualität welches dann wahrscheinlich größer ist.

Es ist besser genau umgekehrt zu arbeiten und erst beim Deployment / Build umzuwandeln. Das könntest du zum Beispiel ganz leicht über
eine bestimmte Namenkonvention erledigen. Zum Beispiel:
{Name}_Tile.png -> png //Tileset
{Name}_Back.png -> jpg //Background Image :)
{Name}_Part.png -> png //Partikel, wahrscheinlich Alphakanal und Animationen
{Name}_Wall.png -> png or jpg //Wandtextur, wenn Alphakanal dann png ansonsten jpg

Oder du machst das über die Scripts für deine Materials .... Halt je nachdem was einfacher für dich ist.

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: JPG und Alpha
BeitragVerfasst: Mo Sep 14, 2015 08:21 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2621
Wohnort: Berlin
Programmiersprache: Go, C/C++
Ich benutz in meiner techdemo imagemagick zum vergrößern und sollte es der fall sein noch in srgb farbraum umwandeln(destruktive). Danach jag ich das ganze durch texconv und erzeuge eine dds.
Was wo passierrt legt ein json file fest, welches mit gleichen namen daneben liegt.
In der json steht auf welche auflösung, farbraum, texturformat es umgewandelt werden soll.
Der input kommt vom work ordner und der output geht in dist.
Mein tool guckt mit einem filewatcher und triggered bei veränderung.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: JPG und Alpha
BeitragVerfasst: Mo Sep 14, 2015 09:18 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 14, 2013 21:17
Beiträge: 587
Programmiersprache: C++
Umwandlungen von JPG nach PNG sind nicht zu empfehlen, wie ich oben schon schrieb. Imagemagick habe ich noch nicht probiert, aber dies in Skripte einbauen zu können, ist natürlich ein echter Vorteil. IrfanView funktioniert übrigens hervorragend mit Wine.

_________________
So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: JPG und Alpha
BeitragVerfasst: Mo Sep 14, 2015 11:45 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2621
Wohnort: Berlin
Programmiersprache: Go, C/C++
Ich benutze ein minimales selbstgeschriebene konsolenapp und mach die eigentliche Arbeit in Lua und über externe Tools.
Code:
  1. local ffi = require("ffi")
  2. local bit = require("bit")
  3. local lfs = require('lfs')
  4. local cjson = require("cjson")
  5. local cjson_util = require("cjson.util")
  6.  
  7. function SplitLocation(strfilename)
  8.     -- Returns the Path, Filename, and Extension as 3 values
  9.     return string.match(strfilename, "(.-)([^\\/]-([^\\/%.]+))$")
  10. end
  11.  
  12. function GetFileAndExtension(strfilename)
  13.     -- Returns the Path, Filename, and Extension as 3 values
  14.     return string.match(strfilename, "(.-)%.([^%.]+)$")
  15. end
  16.  
  17. function StartWith(String, Start)
  18.     return string.sub(String, 1, string.len(Start))==Start
  19. end
  20.  
  21. function Supported(ext)
  22.     local known = {"bmp","dds","tiff","tga","jp2","jpg","jpeg","png","svg","psd", "json"}
  23.        
  24.     for _,v in pairs(known) do
  25.       if v == ext then
  26.         return true
  27.       end
  28.     end
  29.     return false
  30. end
  31.  
  32. function IsConfigAvailable(inputFilename)
  33.     local path, extension = GetFileAndExtension(inputFilename)
  34.     local file = GetAssetDir()..path..".json"
  35.     if (not (lfs.attributes(file,'mode') == nil)) then
  36.         return true
  37.     end
  38.     return false
  39. end
  40.  
  41. function GetNearestPowerOf2(value)
  42.     br = bit.rshift
  43.     bor = bit.bor
  44.     next = tonumber(value)
  45.     next = next - 1
  46.     next = bor(next,br(next, 1))
  47.     next = bor(next,br(next, 2))
  48.     next = bor(next,br(next, 4))
  49.     next = bor(next,br(next, 8))
  50.     next = bor(next,br(next, 16))
  51.     next = next + 1
  52.    
  53.     prev = br(next,1)
  54.    
  55.     if (next - value) < (value - prev) then
  56.         result = next
  57.     else
  58.         result = prev
  59.     end
  60.    
  61.     return result
  62. end
  63.  
  64. function GenerateConfig(inputFilename)
  65.     local path, extension = GetFileAndExtension(inputFilename)
  66.     local file = GetAssetDir()..path..".json"
  67.    
  68.     local command = 'identify -format "%[fx:w],%[fx:h]" "'..GetAssetDir()..inputFilename..'"'
  69.     print("Execute: "..command)
  70.     local f = assert(io.popen([["]]..command..[["]], 'r'))
  71.     local s = assert(f:read('*a'))
  72.     f:close()
  73.     w, h = s:match("([^,]+),([^,]+)")
  74.     w = GetNearestPowerOf2(w)
  75.     h = GetNearestPowerOf2(h)    
  76.  
  77.     local config,err = io.open(file, "w")
  78.     if not config then return print(err) end
  79.     config:write(
  80. "{\
  81. \t\"file\":\""..string.sub(inputFilename,string.len("textures/")+1).."\",\
  82. \t\"width\":"..w..",\
  83. \t\"height\":"..h..",\
  84. \t\"filter\":\"Kaiser\",\
  85. \t\"mipmaps\":true,\
  86. \t\"colorspace\":\"sRGB\",\
  87. \t\"outputformat\":\"BC7_UNORM_SRGB\"\
  88. }")
  89.     config:close()
  90. end
  91.  
  92. function BuildTexture(inputFilename)
  93.     local path, extension = GetFileAndExtension(inputFilename)
  94.     local tmpFile = GetTempDir()..path..".png"
  95.     local jsonfile = GetAssetDir()..path..".json"
  96.  
  97.     local json_text = cjson_util.file_load(jsonfile)
  98.     local config = cjson.decode(json_text)
  99.     local inFile = GetAssetDir().."textures/"..config.file
  100.     local params = " -background none -colorspace "..config.colorspace.." \""..inFile.."\" -colorspace "..config.colorspace.." -filter "..config.filter.." -distort resize "..config.width.."x"..config.height.." -extent "..config.width.."x"..config.height.."^< -colorspace sRGB \""..tmpFile.."\""
  101.     local command = "convert"..params
  102.    
  103.     local createDir = SplitLocation(tmpFile)
  104.     lfs.mkdir(createDir)
  105.     print("Execute: "..command)
  106.     os.execute([["]]..command..[["]])
  107.    
  108.     if (config.mipmaps == false) then
  109.         params = '-m 0 '
  110.     else
  111.         params = ''
  112.     end
  113.     params = params..'-nologo -srgbi -f '..config.outputformat..' -o "'..GetExportDir()..'" "'..path..'.png"'
  114.     command = 'pushd "'..GetTempDir()..'" && "'..GetAppDir()..'texconv" '..params
  115.     local createDir = SplitLocation(GetExportDir()..path)
  116.     lfs.mkdir(createDir)
  117.     print("Execute: "..command)
  118.     os.execute([["]]..command..[["]])
  119.    
  120.     os.remove(tmpFile)
  121.  
  122.     GenerateAsset(inputFilename)
  123. end
  124.  
  125. function start(inputFilename)
  126.     local path, file, extension = SplitLocation(inputFilename)
  127.  
  128.     if (StartWith(path,"textures/") and Supported(extension)) then
  129.         if(not IsConfigAvailable(inputFilename)) then
  130.             GenerateConfig(inputFilename)
  131.         end
  132.  
  133.         BuildTexture(inputFilename)
  134.     end    
  135. end

Das Script hat ledeglich 3 C Funktionen, GetAssetDir, GetExportDir, GetTempDir, welche von dem C++ Tool kommen der rest sind Module die mit LuaJit mit kommen.
Ich erzeuge für jede Unterstützte Datei eine JSON, wenn nicht vorhanden, rufe convert(imagemagick), identify(imagemagick) und texconv(Microsoft standalone tool) auf.
Der Inhalt von JSON files wird in dem Luascript fest gelegt.
Ich kopiere radonframework3.svg in den work Ordner und meine C++ App ruft das Luascript auf und übergibt den Dateiname.
Es wird eine JSON angelegt und im Export Ordner die BC7 DDS abgelegt.
Code:
  1. {
  2.     "file":"radonframework3.svg",
  3.     "width":512,
  4.     "height":256,
  5.     "filter":"Kaiser",
  6.     "mipmaps":true,
  7.     "colorspace":"sRGB",
  8.     "outputformat":"bc7_unorm_srgb"
  9. }

Die File kann ich dann in Notepad noch anpassen und jedes mal, wenn ich was an den parametern änder und speicher wird das Lua Script wieder aufgerufen, Aktualisiert das Export Asset und informiert alle Clients, die sich an den Converter Service registriert haben(zwecks hot asset loading).

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: JPG und Alpha
BeitragVerfasst: Mo Sep 14, 2015 14:47 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
glAwesome hat geschrieben:
Umwandlungen von JPG nach PNG sind nicht zu empfehlen, wie ich oben schon schrieb. Imagemagick habe ich noch nicht probiert, aber dies in Skripte einbauen zu können, ist natürlich ein echter Vorteil. IrfanView funktioniert übrigens hervorragend mit Wine.


Irfan hat soweit ich weiß auch Konsole nur gibs des halt nicht auf jeden 0815 php Server :mrgreen:

war glaube ich: i_view32.exe c:\src\*.jpg convert=c:\dst\*png

edit:
Außerdem es ist halt definitiv Featureärmer als ImageMagick oder Inkscape

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: JPG und Alpha
BeitragVerfasst: Mo Sep 14, 2015 16:32 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Zitat:
Ich benutze ein minimales selbstgeschriebene konsolenapp und mach die eigentliche Arbeit in Lua und über externe Tools.

In was für einer Sprache ist den Script geschrieben ?

Zitat:
Umwandlungen von JPG nach PNG sind nicht zu empfehlen,

Dann werde ich die Datei so belassen, wie das Original ist.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: JPG und Alpha
BeitragVerfasst: Mo Sep 14, 2015 17:44 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
Nennt sich Lua. Das ist eine dieser Sprachen welche die Fehler von Python nachbauen *möp* hab euch lieb :mrgreen:

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: JPG und Alpha
BeitragVerfasst: Mo Sep 14, 2015 22:16 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2621
Wohnort: Berlin
Programmiersprache: Go, C/C++
mathias hat geschrieben:
Zitat:
Ich benutze ein minimales selbstgeschriebene konsolenapp und mach die eigentliche Arbeit in Lua und über externe Tools.

In was für einer Sprache ist den Script geschrieben ?

Das Script ist Lua.

Lua kann man recht breitbanding einsetzen.
Blizzard nutzt Lua in WoW(für alles, was mit dem User zu tun hat), Crytek in Cryengine(gamelogik) und Adobe in Light Room(program logik).

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 26 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 41 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.129s | 17 Queries | GZIP : On ]