Hallo Leute,
Ich arbeite zur Zeit an einem Projekt um IrfanView-Befehle über eine externe Anwendung auszuführen, dass Problem ist wenn mehr als 1 Befehl ausgeführt wird kommt es zu der benannten Fehlermeldung.
Ich hoffe hier kann mir jemand helfen.
Hier habe ich ein kleines Projekt gemacht um dies zu veranschaulichen.
Es ist von mir beabsichtigt dass die beiden IrfanView Befehle getrennt abgewickelt werden, nicht auf einmal.
Hier noch der Exception Text
mfg seppal
Ich arbeite zur Zeit an einem Projekt um IrfanView-Befehle über eine externe Anwendung auszuführen, dass Problem ist wenn mehr als 1 Befehl ausgeführt wird kommt es zu der benannten Fehlermeldung.
Ich hoffe hier kann mir jemand helfen.
Hier habe ich ein kleines Projekt gemacht um dies zu veranschaulichen.
Code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Threading;
namespace testBildbearbeitung
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void BildOeffnenbutton_Click(object sender, EventArgs e)
{
string bild;
openFileDialog1.ShowDialog();
bild = openFileDialog1.FileName.ToString();
//Bild wird in PictureBox angezeigt
pictureBox1.Image = Image.FromFile(bild);
}
private void Befehledurchlaufenbutton_Click(object sender, EventArgs e)
{
string pfad; //Der Pfad wo IrfanView installiert ist
string command; //Der Befehl der über IrfanView abgewickelt werden soll
bool success;
FileStream fs1;
Bitmap bearbeitungs_speicher = null; //Die in der PictureBox geladene BitMap
//Die beiden Zwischenspeicher 1 und 2 werden, falls sie existieren gelöscht
//In Zwischenspeicher1 wird das aktuell geladene Bild der PictureBox gespeichert
//In Zwischenspeicher2 wird das durch IrfanView bearbeitete Bild gespeichert, welches dann wieder in die BitMap geladen wird
if (File.Exists("C:\\zwischenspeicher1.jpg"))
File.Delete("C:\\zwischenspeicher1.jpg");
if (File.Exists("C:\\zwischenspeicher2.jpg"))
File.Delete("C:\\zwischenspeicher2.jpg");
pictureBox1.Image.Save("C:\\zwischenspeicher1.jpg");
pfad = "C:\\Programme\\IrfanView\\i_view32.exe";
command = "c:\\zwischenspeicher.jpg /gray /convert=c:\\zwischenspeicher2.jpg /silent";
System.Diagnostics.Process.Start(pfad, command);
do
{
success = true;
try
{
fs1 = new FileStream("C:\\zwischenspeicher2.jpg", FileMode.Open);
bearbeitungs_speicher = (Bitmap)Image.FromStream(fs1);
fs1.Close();
}
catch (OutOfMemoryException)
{
success = false;
}
catch (IOException)
{
success = false;
}
if (!success) Thread.Sleep(100);
} while (!success);
pictureBox1.Image = bearbeitungs_speicher;
//Bis hier hin funktioniert noch alles wie gehabt
if (File.Exists("C:\\zwischenspeicher1.jpg"))
File.Delete("C:\\zwischenspeicher1.jpg");
if (File.Exists("C:\\zwischenspeicher2.jpg"))
File.Delete("C:\\zwischenspeicher2.jpg");
//beim pictureBox1.Image.Save stürzt das Programm dann ab und meldet einen "Allgemeinen Fehler in GDI+"
pictureBox1.Image.Save("C:\\zwischenspeicher1.jpg");
//hier würde dann ein anderer IrfanView Befehl behandelt werden
command = "c:\\zwischenspeicher.jpg /rotate_r /convert=c:\\zwischenspeicher2.jpg /silent";
System.Diagnostics.Process.Start(pfad, command);
do
{
success = true;
try
{
fs1 = new FileStream("C:\\zwischenspeicher2.jpg", FileMode.Open);
bearbeitungs_speicher = (Bitmap)Image.FromStream(fs1);
fs1.Close();
}
catch (OutOfMemoryException)
{
success = false;
}
catch (IOException)
{
success = false;
}
if (!success) Thread.Sleep(100);
} while (!success);
pictureBox1.Image = bearbeitungs_speicher;
}
}
}
Es ist von mir beabsichtigt dass die beiden IrfanView Befehle getrennt abgewickelt werden, nicht auf einmal.
Hier noch der Exception Text
Code:
System.Runtime.InteropServices.ExternalException wurde nicht behandelt.
Message="Allgemeiner Fehler in GDI+."
Source="System.Drawing"
ErrorCode=-2147467259
StackTrace:
bei System.Drawing.Image.Save(String filename, ImageCodecInfo encoder, EncoderParameters encoderParams)
bei System.Drawing.Image.Save(String filename, ImageFormat format)
bei System.Drawing.Image.Save(String filename)
bei testBildbearbeitung.Form1.button2_Click(Object sender, EventArgs e) in G:\testIrfanView.cs:Zeile 86.
bei System.Windows.Forms.Control.OnClick(EventArgs e)
bei System.Windows.Forms.Button.OnClick(EventArgs e)
bei System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
bei System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
bei System.Windows.Forms.Control.WndProc(Message& m)
bei System.Windows.Forms.ButtonBase.WndProc(Message& m)
bei System.Windows.Forms.Button.WndProc(Message& m)
bei System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
bei System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
bei System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
bei System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
bei System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
bei System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
bei System.Windows.Forms.Application.Run(Form mainForm)
bei testBildbearbeitung.Program.Main() in C:\Dokumente und Einstellungen\Daniel\Eigene Dateien\testDA\testBildbearbeitung\testBildbearbeitung\Program.cs:Zeile 17.
bei System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
bei System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
bei Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
bei System.Threading.ThreadHelper.ThreadStart_Context(Object state)
bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
bei System.Threading.ThreadHelper.ThreadStart()
mfg seppal