Kesalahan umum terjadi di GDI +, Gambar JPEG ke MemoryStream

326

Ini tampaknya sedikit kesalahan terkenal di seluruh web. Sedemikian rupa sehingga saya tidak dapat menemukan jawaban untuk masalah saya karena skenario saya tidak cocok. Pengecualian terlempar ketika saya menyimpan gambar ke aliran.

Anehnya ini bekerja dengan baik dengan png tetapi memberikan kesalahan di atas dengan jpg dan gif yang agak membingungkan.

Sebagian besar masalah serupa di luar sana berhubungan dengan menyimpan gambar ke file tanpa izin. Ironisnya solusinya adalah menggunakan aliran memori seperti yang saya lakukan ....

public static byte[] ConvertImageToByteArray(Image imageToConvert)
{
    using (var ms = new MemoryStream())
    {
        ImageFormat format;
        switch (imageToConvert.MimeType())
        {
            case "image/png":
                format = ImageFormat.Png;
                break;
            case "image/gif":
                format = ImageFormat.Gif;
                break;
            default:
                format = ImageFormat.Jpeg;
                break;
        }

        imageToConvert.Save(ms, format);
        return ms.ToArray();
    }
}

Lebih detail untuk pengecualian. Alasan ini menyebabkan begitu banyak masalah adalah kurangnya penjelasan :(

System.Runtime.InteropServices.ExternalException was unhandled by user code
Message="A generic error occurred in GDI+."
Source="System.Drawing"
ErrorCode=-2147467259
StackTrace:
   at System.Drawing.Image.Save(Stream stream, ImageCodecInfo encoder, EncoderParameters    encoderParams)
   at System.Drawing.Image.Save(Stream stream, ImageFormat format)
   at Caldoo.Infrastructure.PhotoEditor.ConvertImageToByteArray(Image imageToConvert) in C:\Users\Ian\SVN\Caldoo\Caldoo.Coordinator\PhotoEditor.cs:line 139
   at Caldoo.Web.Controllers.PictureController.Croppable() in C:\Users\Ian\SVN\Caldoo\Caldoo.Web\Controllers\PictureController.cs:line 132
   at lambda_method(ExecutionScope , ControllerBase , Object[] )
   at System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters)
   at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters)
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters)
   at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClassa.<InvokeActionMethodWithFilters>b__7()
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation)
 InnerException: 

OK hal yang sudah saya coba sejauh ini.

  1. Mengkloning gambar dan mengerjakannya.
  2. Mengambil encoder untuk MIME yang melewatinya dengan pengaturan kualitas jpeg.
madcapnmckay
sumber
terkait: stackoverflow.com/questions/4671449/...
Patrick Szalapski
3
Bagi saya, masalahnya adalah folder itu tidak ada. Diperbaiki dengan hanya membuat folder.
hazjack
Bagi saya itu adalah indeks di luar jangkauan yang tertelan.
Billy Jake O'Connor

Jawaban:

189

OK Saya tampaknya telah menemukan penyebabnya hanya karena keberuntungan belaka dan tidak ada yang salah dengan metode khusus itu, lebih lanjut mendukung tumpukan panggilan.

Sebelumnya saya mengubah ukuran gambar dan sebagai bagian dari metode itu saya mengembalikan objek yang diubah ukurannya sebagai berikut. Saya telah memasukkan dua panggilan ke metode di atas dan menyimpan langsung ke file.

// At this point the new bitmap has no MimeType
// Need to output to memory stream
using (var m = new MemoryStream())
{
       dst.Save(m, format);

       var img = Image.FromStream(m);

       //TEST
       img.Save("C:\\test.jpg");
       var bytes = PhotoEditor.ConvertImageToByteArray(img);


       return img;
 }

Tampaknya bahwa aliran memori bahwa benda itu dibuat pada memiliki untuk terbuka pada saat objek tersebut disimpan. Saya tidak yakin mengapa ini terjadi. Adakah yang bisa mencerahkan saya dan bagaimana saya bisa mengatasi ini.

Saya hanya kembali dari aliran karena setelah menggunakan kode pengubahan ukuran yang mirip dengan ini file tujuan memiliki tipe mime yang tidak diketahui (img.RawFormat.Guid) dan Id seperti tipe Mime menjadi benar pada semua objek gambar karena membuatnya sulit menulis generik menangani kode sebaliknya.

EDIT

Ini tidak muncul dalam pencarian awal saya, tetapi inilah jawaban dari Jon Skeet

madcapnmckay
sumber
4
Saya tidak menyadari bahwa ketika Anda mendapatkan bitmap dari aliran memori Anda tidak harus menutup alirannya. sangat membantu, terima kasih
mcdon
38
Terima kasih. Ini mungkin menyelamatkan rambutku yang terakhir.
NotMe
6
Terima kasih! ini menghemat banyak waktu saya, satu hal, maukah Anda menyoroti penyebab kesalahan di awal jawaban Anda karena saya (dan saya kira kebanyakan falks) melewatkannya di skim asli melalui jawaban, mungkin sesuatu seperti " JANGAN TUTUP STREAM MEMORI JIKA ANDA BERGUNAKAN CITRA LAGI "akan lebih baik; D
DorD
6
Apa variabel "pertama" Anda?
WEFX
1
@madcapnmckay tolong jelaskan apa variabel 'dst' dan signifikansinya
Mike T
131

Jika Anda mendapatkan kesalahan itu, maka saya dapat mengatakan bahwa aplikasi Anda tidak memiliki izin menulis di beberapa direktori.

Misalnya, jika Anda mencoba untuk menyimpan gambar dari aliran memori ke sistem file, Anda mungkin mendapatkan kesalahan itu.

Silakan jika Anda menggunakan XP, pastikan untuk menambahkan izin menulis untuk akun aspnet pada folder itu.

Jika Anda menggunakan windows server (2003,2008) atau Vista, pastikan bahwa menambahkan izin tulis untuk akun layanan jaringan.

Semoga ini bisa membantu seseorang.

Savindra
sumber
7
Kamu tidak! Saya menghabiskan 2 jam dengan izin menulis sialan ... Datang ke sini untuk memposting ini. Semoga Anda mendapatkan lebih banyak suara. :)
Gleno
2
INI adalah solusi bagi saya. Memberi +1 sepenuhnya!
Kakek
5
Anda dapat melakukan File.WriteAllText ("filename.jpg", "") lalu File.DeleteFile ("filename.jpg") sebelum Anda menyimpan bitmap. Di benmark saya, ini hanya membutuhkan 0,001 detik dan Anda mendapatkan 'Anda tidak memiliki izin untuk menyimpan filename.jpg di sana'
Despertar
@Despertar Maksud Anda File.Delete (), tapi itu trik yang sangat berguna! Pasti akan menggunakan ini setiap kali saya menyimpan bitmap.
D Coetzee
2
Dalam kasus saya, direktori tidak ada.
silencedmessage
54

Saya akan menambahkan penyebab kesalahan ini juga dengan harapan ini membantu beberapa pelancong internet masa depan. :)

GDI + membatasi ketinggian maksimum gambar hingga 65500

Kami melakukan pengubahan ukuran gambar dasar, tetapi dalam pengubahan ukuran kami mencoba mempertahankan rasio aspek. Kami memiliki seorang pria QA yang sedikit terlalu pandai dalam pekerjaan ini; ia memutuskan untuk menguji ini dengan foto SATU piksel lebar yang tingginya 480 piksel. Ketika gambar diskalakan untuk memenuhi dimensi kami, tingginya berada di utara 68.000 piksel dan aplikasi kami meledak A generic error occurred in GDI+.

Anda dapat memverifikasi ini sendiri dengan tes:

  int width = 480;
  var height = UInt16.MaxValue - 36; //succeeds at 65499, 65500
  try
  {
    while(true)
    {
      var image = new Bitmap(width, height);
      using(MemoryStream ms = new MemoryStream())
      {
        //error will throw from here
        image.Save(ms, ImageFormat.Jpeg);
      }
      height += 1;
    }
  }
  catch(Exception ex)
  {
    //explodes at 65501 with "A generic error occurred in GDI+."
  }

Sayang sekali tidak ada .net ramah ArgumentExceptiondilemparkan ke konstruktor Bitmap.

Fred
sumber
17
Terima kasih - penjelajah waktu Internet ini cukup berterima kasih karena Anda meninggalkan pesan ini.
Tom West
Dari pengujian saya, 65535 sebenarnya adalah nilai maks. Pada 65536 saya mulai melihat kesalahan umum.
ChaseMedallion
Coba saja ini lagi: Win10 .net 4.5 dan .net 4.6.1, dan meledak pada 65501 yang tampaknya bahkan lebih acak. Kode juga penuh dengan kesalahan sintaks, akan memperbarui :)
Fred
37

Artikel ini menjelaskan secara terperinci apa yang sebenarnya terjadi: Ketergantungan Bitmap dan konstruktor Gambar

Singkatnya, untuk seumur hidup dari Imagekonstruksi dari aliran , aliran itu tidak boleh dihancurkan.

Jadi, bukannya

using (var strm = new ... )  {
    myImage = Image.FromStream(strm);
}

coba ini

Stream imageStream;
...

    imageStream = new ...;
    myImage = Image.FromStream(strm);

dan tutup imageStream pada form tutup atau tutup halaman web.

Ivan Mesic
sumber
Yap yang ini menangkap saya. Saya menjadi teliti dan membungkus aliran saya menjadi usingdan kemudian mencoba menyalin gambar ke dalam aliran memori dan menerima pesan "Generic error in GDI +".
Will Appleby
Tautan Anda memberi saya pengalihan tak terbatas; ini bekerja. Saya mendapat masalah dengan menabung PixelFormat.Format32bppArgbtetapi tidakPixelFormat.Format1bppIndexed . Artikel yang Anda tautkan menjelaskan alasannya: GDI + dapat memilih untuk mendekode ulang data bitmap dari aliran sumber daripada menyimpan semua yang ada di memori. Dugaan saya adalah bahwa itu tidak men-decode ulang gambar 1bpp.
labreuer
Bahkan tautan baru tidak berfungsi lagi. Pencarian google sederhana tampaknya tidak mengungkapkan halaman yang benar. Tetapi saya sangat senang menemukan jawaban ini! Pekerjaan saya dengan menyalin ke bitmap baru gagal karena masalah ini
Katjoek
28

Anda juga akan mendapatkan pengecualian ini jika Anda mencoba menyimpan ke jalur yang tidak valid atau jika ada masalah izin.

Jika Anda tidak 100% yakin bahwa jalur file tersedia dan izinnya benar maka cobalah menulis a ke file teks. Ini hanya membutuhkan beberapa detik untuk mengesampingkan apa yang akan menjadi perbaikan yang sangat sederhana.

var img = System.Drawing.Image.FromStream(incomingStream);

// img.Save(path);
System.IO.File.WriteAllText(path, "Testing valid path & permissions.");

Dan jangan lupa untuk membersihkan file Anda.

Kirk Broadhurst
sumber
Ini adalah masalah bagi saya ... Saya berharap kesalahannya tidak terlalu kabur, akan menyelamatkan saya banyak waktu.
Oofpez
Iya! Folder tempat Anda menyimpan harus ada. Saya sekarang melakukan pengecekan untuk itu terlebih dahulu, sebelum saya mencoba menyimpan gambar. (Tetap saja, kesalahan itu membuat saya keluar, sekitar setahun sekali.)
Magnus Smith
Path saya adalah direktori, bukan file.
Asen Kasimov
20

Simpan gambar ke variabel bitmap

using (var ms = new MemoryStream())
{
    Bitmap bmp = new Bitmap(imageToConvert);
    bmp.Save(ms, format);
    return ms.ToArray();
}
Amir Atashin
sumber
Ini telah memecahkan masalah saya. Bisakah Anda menjelaskan mengapa menyimpan gambar ke Bitmap membuat pengecualian itu hilang?
jmc
Menyelamatkan hari saya .. tidak tahu apa yang menyebabkan masalah ini tetapi Bitmap save berfungsi .. System.Drawing.Image tidak akan menyimpan ke aliran memori tetapi Bitmap tidak !!!
San
Ini solusi terbaik bagi saya. Membuat Bitmap baru dan mengonversinya.
uzay95
17

Untuk berjaga-jaga jika seseorang melakukan hal yang bodoh seperti saya. 1. pastikan path memang ada. 2. pastikan Anda memiliki izin untuk menulis. 3. pastikan path Anda benar, dalam kasus saya saya tidak ada nama file di TargetPath :(

seharusnya dikatakan, jalur Anda menyebalkan daripada "Terjadi kesalahan umum pada GDI +"

ahsant
sumber
16

Saya juga mendapatkan kesalahan ini saat menyimpan JPEG, tetapi hanya untuk gambar tertentu.

Kode terakhir saya:

  try
  {
    img.SaveJpeg(tmpFile, quality); // This is always successful for say image1.jpg, but always throws the GDI+ exception for image2.jpg
  }
  catch (Exception ex)
  {
    // Try HU's method: Convert it to a Bitmap first
    img = new Bitmap(img); 
    img.SaveJpeg(tmpFile, quality); // This is always successful
  }

Saya tidak membuat gambar jadi saya tidak tahu apa bedanya.
Saya akan menghargai jika ada yang bisa menjelaskan itu.

Ini adalah fungsi SaveJpeg saya, hanya FYI:

private static void SaveJpeg(this Image img, string filename, int quality)
{
  EncoderParameter qualityParam = new EncoderParameter(Encoder.Quality, (long)quality);
  ImageCodecInfo jpegCodec = GetEncoderInfo("image/jpeg");
  EncoderParameters encoderParams = new EncoderParameters(1);
  encoderParams.Param[0] = qualityParam;
  img.Save(filename, jpegCodec, encoderParams);
}

private static ImageCodecInfo GetEncoderInfo(string mimeType)
{
    var encoders = ImageCodecInfo.GetImageEncoders();
    var encoder = encoders.SingleOrDefault(c => string.Equals(c.MimeType, mimeType, StringComparison.InvariantCultureIgnoreCase));
    if (encoder == null) throw new Exception($"Encoder not found for mime type {mimeType}");
    return encoder;
}
Aximili
sumber
1
Ini mengatasi hari-hari mencabut rambut. Ini adalah kode wtf paling saya pikir saya pernah menulis :)
Jeff Dunlop
13

Saya menemukan bahwa jika salah satu folder induk tempat saya menyimpan file memiliki ruang tambahan maka GDI + akan membuang pengecualian umum.

Dengan kata lain, jika saya mencoba menyimpan ke "C: \ Documents and Settings \ myusername \ Local Settings \ Temp \ ABC DEF M1 Nilai-Nilai Tren \ Gambar \ picture.png" maka itu melemparkan pengecualian umum.

Nama folder saya dibuat dari nama file yang kebetulan memiliki ruang tambahan sehingga mudah .Trim () dan lanjutkan.

Igilima
sumber
3
luar biasa - Saya tidak akan pernah berpikir untuk melihat jalur direktori yang dekat
jharr100
11

jika kode Anda adalah sebagai berikut maka kesalahan ini juga terjadi

private Image GetImage(byte[] byteArray)
{
   using (var stream = new MemoryStream(byteArray))
   {
       return Image.FromStream(stream);
    }
}

Yang benar adalah

private Image GetImage(byte[] byteArray)
{
   var stream = new MemoryStream(byteArray))
   return Image.FromStream(stream);        
}

Ini mungkin karena kami kembali dari blok penggunaan

dhinesh
sumber
bagi saya itu adalah pengembalian dalam blok menggunakan. Saya masih menggunakan tetapi saya mengembalikan nilai di luar blok. Terima kasih!
Dragouf
1
Saya menemukan "jalan yang sulit" bahwa jika Anda menyimpan lagi Gambar itu ke Stream baru (seperti HttpContext.Response.OutputStream misalnya) Anda harus juga melakukan stream.Flush (), jika tidak kesalahan terjadi lagi.
Lucian
11

Ini merupakan perluasan / kualifikasi dari respons Fred yang menyatakan: "GDI membatasi ketinggian gambar hingga 65534". Kami mengalami masalah ini dengan salah satu aplikasi .NET kami, dan setelah melihat pos itu, tim outsourcing kami mengangkat tangan dan berkata bahwa mereka tidak dapat memperbaiki masalah tanpa perubahan besar.

Berdasarkan pengujian saya, dimungkinkan untuk membuat / memanipulasi gambar dengan ketinggian lebih besar dari 65534, tetapi masalah muncul ketika menyimpan ke aliran atau file DALAM FORMAT TERTENTU . Dalam kode berikut, pemanggilan metode t.Save () melempar teman kami pengecualian umum ketika tinggi piksel adalah 65501 untuk saya. Untuk alasan rasa ingin tahu, saya mengulangi tes untuk lebar, dan batas yang sama berlaku untuk tabungan.

    for (int i = 65498; i <= 100000; i++)
    {
        using (Bitmap t = new Bitmap(800, i))
        using (Graphics gBmp = Graphics.FromImage(t))
        {
            Color green = Color.FromArgb(0x40, 0, 0xff, 0);
            using (Brush greenBrush = new SolidBrush(green))
            {
                // draw a green rectangle to the bitmap in memory
                gBmp.FillRectangle(greenBrush, 0, 0, 799, i);
                if (File.Exists("c:\\temp\\i.jpg"))
                {
                    File.Delete("c:\\temp\\i.jpg");
                }
                t.Save("c:\\temp\\i.jpg", ImageFormat.Jpeg);
            }
        }
        GC.Collect();
    }

Kesalahan yang sama juga terjadi jika Anda menulis ke aliran memori.

Untuk memperbaikinya, Anda dapat mengulangi kode di atas dan mengganti ImageFormat.Tiff atau ImageFormat.Bmp untuk ImageFormat.Jpeg.

Ini berjalan hingga ketinggian / lebar 100.000 untuk saya - saya tidak menguji batas. Seperti yang terjadi. Tiff adalah opsi yang layak bagi kami.

DIPERINGATKAN

TIFF di memori stream / file mengkonsumsi lebih banyak memori daripada rekan-rekan JPG mereka.

vipes
sumber
10

Punya masalah yang sangat mirip dan juga mencoba mengkloning gambar yang tidak berfungsi. Saya menemukan bahwa solusi terbaik adalah membuat objek Bitmap baru dari gambar yang diambil dari aliran memori. Dengan begitu aliran bisa dibuang misalnya

using (var m = new MemoryStream())
{
    var img = new Bitmap(Image.FromStream(m));
    return img;
}

Semoga ini membantu.

HU
sumber
6

Kesalahan terjadi karena Izin. pastikan folder memiliki SEMUA PERIZINAN.

public Image Base64ToImage(string base64String)
    {
        // Convert Base64 String to byte[]
        byte[] imageBytes = Convert.FromBase64String(base64String);
        MemoryStream ms = new MemoryStream(imageBytes, 0,
          imageBytes.Length);

        // Convert byte[] to Image
        ms.Write(imageBytes, 0, imageBytes.Length);
        Image image = Image.FromStream(ms, true);
        return image;
    }

 img.Save("YOUR PATH TO SAVE IMAGE")
Gaurang s
sumber
Aku setuju denganmu. Saya memecahkan masalah ini dengan IZIN
praguan
5

ASK - Saya punya masalah ini. Perbaikannya, bagi saya, adalah menaikkan kuota disk untuk IUSR di server IIS. Dalam hal ini, kami memiliki aplikasi katalog dengan gambar item dan semacamnya. Kuota unggahan untuk "Pengguna Web Anonim" disetel ke 100MB, yang merupakan default untuk server IIS perusahaan hosting ini. Saya menaikkannya menjadi 400MB dan dapat mengunggah gambar tanpa kesalahan.

Ini mungkin bukan masalah Anda, tetapi jika itu, ini adalah perbaikan yang mudah.

Marco
sumber
4

Dalam kasus saya masalahnya ada di jalur yang saya simpan (root C:\). Mengubahnya untuk D:\111\membuat pengecualian hilang.

Ani
sumber
4

Penyebab lain untuk kesalahan ini - jalur yang Anda tunjukkan dalam metode Simpan pada contoh Bitmap tidak ada atau Anda belum menyediakan jalur lengkap / valid.

Baru saja mengalami kesalahan ini karena saya memasukkan nama file dan bukan path lengkap!

Itu terjadi!

MytyMyky
sumber
4

Giliran saya!

using (System.Drawing.Image img = Bitmap.FromFile(fileName))
{
      ... do some manipulation of img ...
      img.Save(fileName, System.Drawing.Imaging.ImageFormat.Jpeg);
}

Dapatkan di .Simpan ... karena using () menahan file terbuka, jadi saya tidak bisa menimpanya. Mungkin ini akan membantu seseorang di masa depan.

Andy
sumber
4

Masalah yang sama yang saya hadapi. Tetapi dalam kasus saya, saya mencoba menyimpan file dalam drive C dan itu tidak dapat diakses. Jadi saya mencoba menyimpannya dalam drive D yang sepenuhnya dapat diakses dan saya berhasil.

Jadi, pertama-tama periksa folder yang Anda coba simpan. Anda harus memiliki semua (baca dan tulis) hak untuk folder tertentu.

Jaimin
sumber
menyebabkan biasanya c tidak mengizinkan tanpa izin administrator.
Aneeq Azam Khan
2

Saya perhatikan bahwa case "jpeg" Anda sebenarnya:

            default:
                format = ImageFormat.Jpeg;
                break;

Apakah Anda yakin formatnya adalah jpeg dan bukan yang lain?

Saya akan mencoba:

            case "image/jpg": // or "image/jpeg" !
                format = ImageFormat.Jpeg;
                break;

Atau periksa apa imageToConvert.MimeType()yang sebenarnya kembali.

MEMPERBARUI

Apakah ada inisialisasi lain yang perlu Anda lakukan untuk objek MemoryStream?

ChrisF
sumber
Terima kasih. Sudah pasti dipanggil dengan format yang benar. Saya memuat jpg, men-debug dan mengkonfirmasi mime diakui sebagai image / jpeg dan formatnya adalah JPG.
madcapnmckay
3
Oh well - saya selalu berusaha menghilangkan yang sudah jelas terlebih dahulu. Saya tidak bisa menghitung berapa kali saya tidak melakukan itu dan itu kembali menggigit saya nanti.
ChrisF
2
  • Saya memiliki masalah ini di server pengujian tetapi tidak di server langsung.
  • Saya sedang menulis gambar ke aliran, jadi itu bukan masalah izin.
  • Saya telah langsung menyebarkan beberapa. Dll ke server uji.
  • Menerapkan seluruh solusi untuk menyelesaikan masalah, jadi itu mungkin ketidakcocokan kompilasi yang aneh
Chris Halcrow
sumber
2

Hanya untuk melemparkan solusi lain yang mungkin pada tumpukan, saya akan menyebutkan kasus saya mengalami pesan kesalahan ini. Metode ini Bitmap.Saveakan membuang pengecualian ini ketika menyimpan bitmap yang telah saya ubah dan sedang ditampilkan. Saya menemukan itu tidak akan membuang pengecualian jika pernyataan itu memiliki breakpoint di atasnya, juga tidak akan jika Bitmap.Savedidahului olehThread.Sleep(500) jadi saya kira ada semacam pertikaian sumber daya yang terjadi.

Cukup menyalin gambar ke objek Bitmap baru sudah cukup untuk mencegah pengecualian ini muncul:

new Bitmap(oldbitmap).Save(filename);
Segfault
sumber
2

Kami memiliki masalah serupa dalam menghasilkan a PDF atau mengubah ukuran gambar menggunakan lib ImageProcessor di server produksi.

Daur ulang kumpulan aplikasi untuk memperbaiki masalah.

tech-gayan
sumber
1

Jika Anda mencoba untuk menyimpan gambar ke lokasi yang jauh, pastikan untuk menambahkan NETWORK_SERVICEakun pengguna ke dalam pengaturan keamanan dan memberikan izin kepada pengguna untuk membaca dan menulis. Kalau tidak, itu tidak akan berhasil.

JAH
sumber
1
byte[] bts = (byte[])page1.EnhMetaFileBits; 
using (var ms = new MemoryStream(bts)) 
{ 
    var image = System.Drawing.Image.FromStream(ms); 
    System.Drawing.Image img = image.GetThumbnailImage(200, 260, null, IntPtr.Zero);      
    img.Save(NewPath, System.Drawing.Imaging.ImageFormat.Png);
}
jeka
sumber
1

Sederhana, buat instance baru Bitmap memecahkan masalah.

string imagePath = Path.Combine(Environment.CurrentDirectory, $"Bhatti{i}.png");
Bitmap bitmap = new Bitmap(image);
bitmap.Save(imagePath);
Hassan Rahman
sumber
0

Bagi saya, saya menggunakan Image.Save(Stream, ImageCodecInfo, EncoderParameters)dan tampaknya ini menyebabkan A generic error occurred in GDI+kesalahan terkenal .

Saya mencoba menggunakan EncoderParameteruntuk menyimpan jpegs dalam kualitas 100%. Ini bekerja dengan baik pada "mesin saya" (doh!) Dan bukan pada produksi.

Saat saya menggunakannya Image.Save(Stream, ImageFormat), kesalahannya hilang! Jadi seperti orang idiot saya terus menggunakan yang terakhir meskipun itu menyelamatkan mereka dalam kualitas standar yang saya anggap hanya 50%.

Semoga info ini membantu seseorang.

Ε Г И І И О
sumber
0

Saya juga menemui masalah. Masalahnya adalah karena aliran pemuatan dibuang. Tapi saya tidak membuangnya, itu ada di dalam .Net framework. Yang harus saya lakukan adalah menggunakan:

image_instance = Image.FromFile(file_name);

dari pada

image_instance.Load(file_name);

image_instance adalah tipe System.Windows.Forms.PictureBox! PictureBox's Load () membuang aliran dari mana gambar itu diambil, dan saya tidak tahu itu.

Klaus
sumber
0

Berdasarkan jawaban dari @savindra, jika Anda RHM pada aplikasi Anda dan mencoba dan menjalankannya sebagai administrator maka itu akan menyelesaikan masalah Anda.

Milik saya tampaknya menjadi masalah izin.

AltF4_
sumber
0

Kemungkinan masalah yang menyebabkan kesalahan tersebut adalah:

  1. Direktori tidak ada (Metode yang Anda panggil tidak akan secara otomatis membuat direktori ini untuk Anda)
  2. Izin keamanan untuk menulis ke direktori keluaran tidak mengizinkan pengguna yang menjalankan aplikasi untuk menulis

Saya harap ini membantu, ini adalah perbaikan untuk masalah saya, saya hanya memastikan bahwa direktori keluaran ada sebelum menyimpan gambar keluaran!

Haji Ihab
sumber