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.
- Mengkloning gambar dan mengerjakannya.
- Mengambil encoder untuk MIME yang melewatinya dengan pengaturan kualitas jpeg.
Jawaban:
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.
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
sumber
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.
sumber
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:
Sayang sekali tidak ada .net ramah
ArgumentException
dilemparkan ke konstruktorBitmap
.sumber
Artikel ini menjelaskan secara terperinci apa yang sebenarnya terjadi: Ketergantungan Bitmap dan konstruktor Gambar
Singkatnya, untuk seumur hidup dari
Image
konstruksi dari aliran , aliran itu tidak boleh dihancurkan.Jadi, bukannya
coba ini
dan tutup imageStream pada form tutup atau tutup halaman web.
sumber
using
dan kemudian mencoba menyalin gambar ke dalam aliran memori dan menerima pesan "Generic error in GDI +".PixelFormat.Format32bppArgb
tetapi 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.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.
Dan jangan lupa untuk membersihkan file Anda.
sumber
Simpan gambar ke variabel bitmap
sumber
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 +"
sumber
Saya juga mendapatkan kesalahan ini saat menyimpan JPEG, tetapi hanya untuk gambar tertentu.
Kode terakhir saya:
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:
sumber
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.
sumber
jika kode Anda adalah sebagai berikut maka kesalahan ini juga terjadi
Yang benar adalah
Ini mungkin karena kami kembali dari blok penggunaan
sumber
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.
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.
sumber
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
Semoga ini membantu.
sumber
Kesalahan terjadi karena Izin. pastikan folder memiliki SEMUA PERIZINAN.
sumber
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.
sumber
Dalam kasus saya masalahnya ada di jalur yang saya simpan (root
C:\
). Mengubahnya untukD:\111\
membuat pengecualian hilang.sumber
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!
sumber
Giliran saya!
Dapatkan di .Simpan ... karena using () menahan file terbuka, jadi saya tidak bisa menimpanya. Mungkin ini akan membantu seseorang di masa depan.
sumber
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.
sumber
Saya perhatikan bahwa case "jpeg" Anda sebenarnya:
Apakah Anda yakin formatnya adalah jpeg dan bukan yang lain?
Saya akan mencoba:
Atau periksa apa
imageToConvert.MimeType()
yang sebenarnya kembali.MEMPERBARUI
Apakah ada inisialisasi lain yang perlu Anda lakukan untuk objek MemoryStream?
sumber
sumber
Hanya untuk melemparkan solusi lain yang mungkin pada tumpukan, saya akan menyebutkan kasus saya mengalami pesan kesalahan ini. Metode ini
Bitmap.Save
akan 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 jikaBitmap.Save
didahului 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:
sumber
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.
sumber
Jika Anda mencoba untuk menyimpan gambar ke lokasi yang jauh, pastikan untuk menambahkan
NETWORK_SERVICE
akun pengguna ke dalam pengaturan keamanan dan memberikan izin kepada pengguna untuk membaca dan menulis. Kalau tidak, itu tidak akan berhasil.sumber
sumber
Saya juga mendapatkan kesalahan ini karena saya mencoba untuk menyimpan gambar dengan nama yang sama dengan gambar yang disimpan sebelumnya.
Pastikan Anda tidak menyimpan gambar dengan nama rangkap.
Gunakan untuk thar misalnya fungsi 'Acak' ( Bagaimana generator nomor acak C # berfungsi? ) Atau misalnya menghasilkan Guid ( http://betterexplained.com/articles/the-quick-guide-to-guids/ )
sumber
Sederhana, buat instance baru Bitmap memecahkan masalah.
sumber
Bagi saya, saya menggunakan
Image.Save(Stream, ImageCodecInfo, EncoderParameters)
dan tampaknya ini menyebabkanA generic error occurred in GDI+
kesalahan terkenal .Saya mencoba menggunakan
EncoderParameter
untuk 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
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:
dari pada
image_instance adalah tipe System.Windows.Forms.PictureBox! PictureBox's Load () membuang aliran dari mana gambar itu diambil, dan saya tidak tahu itu.
sumber
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.
sumber
Kemungkinan masalah yang menyebabkan kesalahan tersebut adalah:
Saya harap ini membantu, ini adalah perbaikan untuk masalah saya, saya hanya memastikan bahwa direktori keluaran ada sebelum menyimpan gambar keluaran!
sumber