mboost-dp1

Targa i C#?


Gå til bund
Gravatar #1 - Tang
15. maj 2008 11:37
Er det muligt at åbne billeder af typen Targa (.tga) i C#. Jeg er ved at lave et program, der bla. skal kunne vise previews af nogle billeder... Disse billeder er desvære af typen Targa, hvilket jeg ikke kan få C# til at åbne...

Er der en løsning på dette?
Gravatar #2 - Cyrack
15. maj 2008 11:54
To sekunder på google giver denne: http://www.codeproject.com/KB/graphics/graphicsuit...
Gravatar #3 - Cyrack
15. maj 2008 11:56
[EDIT]

Det er et C++ lib, men det burde være muligt at interface direkte med det i C#, ellers kan du lave native kald til den, og lave managede bitmaps (System.Drawing svjh) ud fra et byte-array.
Gravatar #4 - Tang
15. maj 2008 12:10
Tak for det!

Jeg har dog aldrig prøvet at kalde et C++ lib fra C#. Kunne du måske forklare mig hvad jeg skal gøre?

Jeg har selvfølgelig prøvet at kalde et C# lib...
Gravatar #5 - Cyrack
15. maj 2008 12:27
Gravatar #6 - Tang
15. maj 2008 19:58
#5 Tak for det. Endelig noget C#!

Dog er der et problem..
Klassen FreeImage i det fra codeproject.com, returnerer jo en integer. I det program jeg er ved at lave skal jeg bruge billedet som et objekt af typen Image.

Er det muligt?
Gravatar #7 - illishar
16. maj 2008 13:47
Så vidt jeg husker, så er tga et RAW format.
Du burde derfor blot kunne åbne filen og så bare gå amok.

Betragt følgende funktion:


public unsafe Color Read24bitPixel(int x, int y)
{
byte* p = (byte*)m_bitmapdata.Scan0.ToPointer();
int offset = y * m_bitmapdata.Stride + 3 * x;
return Color.FromArgb((int)p[offset + 2], (int)p[offset + 1], (int)p[offset]);
}



Den læser en farve fra en "raw unsafe image blob". TGA-formatet har vist nok også en alpha-byte, som du naturligvis skal huske at tage højde for.

PS. BitmapData-komponenten får du på følgende vis:

m_bitmapdata = m_bitmap.LockBits(new Rectangle(0, 0, m_bitmap.Size.Width, m_bitmap.Size.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
Gravatar #8 - illishar
16. maj 2008 13:52
Hov, glemte at det nok er det modsatte, du har brug for:

Du læser din tga, som du selv har lyst til og så opretter du et .NET Image, som du skriver bytesene til:


public unsafe void Write24bitPixel(int x, int y, Color color)
{
byte* p = (byte*)m_bitmapdata.Scan0.ToPointer();
int offset = y * m_bitmapdata.Stride + 3*x;
p[offset] = color.B;
p[offset + 1] = color.G;
p[offset + 2] = color.R;
}
Gravatar #9 - Windcape
17. maj 2008 04:20
Eller du kan bruge DirectX til at renderer det med :)
Gravatar #10 - Tang
19. maj 2008 14:27
Tak for de fine svar!
#9 Det lyder faktisk interessant...

Mit problem er, at jeg skal bruge billedet som et objekt af typen Image. Dette er for, at jeg kan vise det i en PictureBox, i en C#-applikation.
Det er muligt, at de ovenstående forslag kan bruges til dette, men jeg er ikke lige i stand til at se det...
DirectX ville selvfølgelig være en mulighed så.
Gravatar #11 - illishar
20. maj 2008 07:42
Det er forholdvis kompliceret at rendere et billede i en PictureBox via DirectX og det vil sandsynligvis ikke give det resultat du søger. (Men det *vil* dog rendere billedet.)
Gravatar #12 - Tang
20. maj 2008 14:31
#11 Det lyder rimeligt!
Tror at jeg prøver DirectX. Kan du/I henvise til et godt tutorial?
Gravatar #13 - Cyrack
21. maj 2008 06:58
Trident:

DirectX i C# (eller .Net generelt) er en pain in the ass, da MS har valgt at droppe understøttelsen for managed DirectX. Derfor skal du a) finde nogen der har lavet en wrapper for dig b) selv skrive en wrapper. At bruge DirectX til en så simpel opgave er i min verden totalt overkill, og illishars løsning i #8 burde kunne give dig hvad du har brug for, ydermere har jeg succesfuldt brug FreeImage til at indlæse andre billeder med i et tidligere projekt, og kan ikke helt se hvor du får problemer?
Gravatar #14 - Windcape
23. maj 2008 14:48
DirectX i C# (eller .Net generelt) er en pain in the ass, da MS har valgt at droppe understøttelsen for managed DirectX.

Nej de har ej.

De har bare valgt ikke at fortsætter på det, men at forsøge at få udviklerne til at bruge XNA istedet.
Du kan stadigvæk bruge MDX uden problemer.
Gravatar #15 - Windcape
23. maj 2008 14:58
Og et eksempel med DirectX, som kan åbne alle billede typer DirectX har support for, inc. tga og ddx.


private Image OpenImage(String filename)
{
byte[] image = File.ReadAllBytes(filename);
Stream stream = new MemoryStream();
stream.Write(image,0,image.Length);
stream.Position = 0;
stream.SetLength(image.Length);

PresentParameters presentParams = new PresentParameters();
presentParams.Windowed = true;
presentParams.SwapEffect = SwapEffect.Discard;
presentParams.AutoDepthStencilFormat = DepthFormat.D16;
presentParams.EnableAutoDepthStencil = true;

Device device = new Device(0,
DeviceType.Hardware,
this.imagePanel,
CreateFlags.SoftwareVertexProcessing,
presentParams
);

BaseTexture texture = TextureLoader.FromStream(device,stream);
GraphicsStream gStream = TextureLoader.SaveToStream(ImageFileFormat.Bmp,texture);

return new Bitmap(gStream);
}


Og brug:


private void TargaPictureBoxForm_Load(object sender, EventArgs e)
{
Image i = OpenImage("flower.tga");
displayPictureBox.Image = i;
}


Nødvendige imports:

using System.IO;
using Microsoft.DirectX;
using Microsoft.DirectX.Direct3D;
Gravatar #16 - Windcape
23. maj 2008 15:02
Og et link til download af hele projektet:

http://web27190.web08.talkactive.net/media/TargaPi...

Og link til Managed DirectX som du skal bruge for at compile:

http://www.microsoft.com/downloads/details.aspx?Fa...
Gravatar #17 - Cyrack
24. maj 2008 07:27
Windcape:

MS har ikke lavet en komplet version af DirectX i managed C# og har medlt ud at de aldrig laver det færdig => droppet understøttelse.
Det er korrekt at de hellere vil have folk over på XNA, da det kan afvikles på XBox360 og Windows.
At det kan lade sig gøre i direct x er ikke ensbetydendemed at det er den rigtige løsning.
Gravatar #18 - Windcape
24. maj 2008 20:11
At det kan lade sig gøre i direct x er ikke ensbetydendemed at det er den rigtige løsning.

Da altid mere rigtig løsning end XNA :D

XNA er noget bras.
Gå til top

Opret dig som bruger i dag

Det er gratis, og du binder dig ikke til noget.

Når du er oprettet som bruger, får du adgang til en lang række af sidens andre muligheder, såsom at udforme siden efter eget ønske og deltage i diskussionerne.

Opret Bruger Login