Saya punya beberapa data biner yang ingin saya simpan sebagai gambar. Ketika saya mencoba untuk menyimpan gambar, itu melontarkan pengecualian jika aliran memori yang digunakan untuk membuat gambar, ditutup sebelum penyimpanan. Alasan saya melakukan ini adalah karena saya secara dinamis membuat gambar dan karenanya .. saya perlu menggunakan aliran memori.
ini kodenya:
[TestMethod]
public void TestMethod1()
{
// Grab the binary data.
byte[] data = File.ReadAllBytes("Chick.jpg");
// Read in the data but do not close, before using the stream.
Stream originalBinaryDataStream = new MemoryStream(data);
Bitmap image = new Bitmap(originalBinaryDataStream);
image.Save(@"c:\test.jpg");
originalBinaryDataStream.Dispose();
// Now lets use a nice dispose, etc...
Bitmap2 image2;
using (Stream originalBinaryDataStream2 = new MemoryStream(data))
{
image2 = new Bitmap(originalBinaryDataStream2);
}
image2.Save(@"C:\temp\pewpew.jpg"); // This throws the GDI+ exception.
}
Adakah yang punya saran tentang bagaimana saya bisa menyimpan gambar dengan aliran ditutup? Saya tidak dapat mengandalkan pengembang untuk mengingat untuk menutup aliran setelah gambar disimpan. Faktanya, pengembang TIDAK ADA IDEA bahwa gambar dibuat menggunakan aliran memori (karena ini terjadi di beberapa kode lain, di tempat lain).
Saya benar-benar bingung :(
using
blok. Saya pikiroriginalBinaryDataStream2
secara otomatis dibuang pada akhir penggunaan. Dan itu akan membuang pengecualian.Jawaban:
Karena ini adalah MemoryStream, Anda benar-benar tidak perlu menutup streaming - tidak ada hal buruk yang akan terjadi jika Anda tidak melakukannya, meskipun jelas merupakan praktik yang baik untuk membuang apa pun yang dapat dibuang. (Lihat pertanyaan ini untuk lebih lanjut tentang ini.)
Namun, Anda harus membuang Bitmap - dan itu akan menutup aliran untuk Anda. Pada dasarnya sekali Anda memberi konstruktor Bitmap sebuah aliran, itu "memiliki" aliran tersebut dan Anda tidak boleh menutupnya. Seperti yang dikatakan oleh dokumen untuk konstruktor itu :
Saya tidak dapat menemukan dokumen apa pun yang menjanjikan untuk menutup streaming saat Anda membuang bitmap, tetapi Anda harus dapat memverifikasinya dengan cukup mudah.
sumber
Kesalahan umum terjadi di GDI +. Mungkin juga akibat dari jalur penyimpanan yang salah ! Butuh waktu setengah hari untuk menyadarinya. Jadi pastikan Anda telah memeriksa ulang jalur untuk menyimpan gambar juga.
sumber
C\Users\mason\Desktop\pic.png
. Usus besar hilang! Saya akan menghabiskan selamanya sebelum saya menyadarinya.Mungkin perlu disebutkan bahwa jika direktori C: \ Temp tidak ada, pengecualian ini juga akan muncul meskipun streaming Anda masih ada.
sumber
Saya memiliki masalah yang sama tetapi sebenarnya penyebabnya adalah aplikasi tidak memiliki izin untuk menyimpan file di C. Ketika saya mengubah ke "D: \ .." gambar telah disimpan.
sumber
Salin Bitmap. Anda harus menjaga aliran tetap terbuka selama bitmap berlangsung.
Saat menggambar gambar: System.Runtime.InteropServices.ExternalException: Terjadi kesalahan umum di GDI
sumber
RawFormat
penting. Jika Anda ingin menggunakan itu, mengambilnya dari suatu tempat objek di sepanjang jalan, tetapi secara umum, save as type apa pun yang Anda benar-benar ingin memiliki .Anda dapat mencoba membuat salinan bitmap lain:
sumber
Kesalahan ini terjadi pada saya ketika saya mencoba dari Citrix. Folder gambar disetel ke C: \ di server, yang saya tidak memiliki hak istimewa. Setelah folder gambar dipindahkan ke drive bersama, kesalahan itu hilang.
sumber
Kesalahan umum terjadi di GDI +. Ini dapat terjadi karena masalah jalur penyimpanan gambar, saya mendapat kesalahan ini karena jalur penyimpanan saya terlalu panjang, saya memperbaikinya dengan terlebih dahulu menyimpan gambar di jalur terpendek dan memindahkannya ke lokasi yang benar dengan teknik penanganan jalur panjang.
sumber
Saya mendapatkan kesalahan ini, karena pengujian otomatis yang saya jalankan, mencoba menyimpan snapshot ke dalam folder yang tidak ada. Setelah saya membuat folder, kesalahan teratasi
sumber
Satu solusi aneh yang membuat kode saya berfungsi. Buka gambar di paint dan simpan sebagai file baru dengan format yang sama (.jpg). Sekarang coba dengan file baru ini dan berhasil. Ini dengan jelas menjelaskan kepada Anda bahwa file tersebut mungkin saja rusak. Ini hanya dapat membantu jika kode Anda memperbaiki semua bug lainnya
sumber
Itu juga muncul bersama saya ketika saya mencoba menyimpan gambar ke jalur
C:\Program Files (x86)\some_directory
dan
.exe
tidak dijalankan untuk dijalankan sebagai administrator, saya harap ini dapat membantu seseorang yang memiliki masalah yang sama juga.sumber
Bagi saya kode di bawah ini crash
A generic error occurred in GDI+
pada baris yang Menyimpan ke aMemoryStream
. Kode berjalan di server web dan saya menyelesaikannya dengan menghentikan dan memulai Application Pool yang menjalankan situs.Pasti ada beberapa kesalahan internal di GDI +
sumber
Saya menemukan kesalahan ini ketika saya mencoba pengeditan gambar sederhana di aplikasi WPF.
Menyetel Sumber elemen Gambar ke bitmap mencegah penyimpanan file. Bahkan pengaturan Source = null sepertinya tidak merilis file.
Sekarang saya tidak pernah menggunakan gambar sebagai elemen Sumber Gambar, jadi saya bisa menimpa setelah mengedit!
EDIT
Setelah mendengar tentang properti CacheOption (Terima kasih kepada @Nyerguds) saya menemukan solusinya: Jadi, alih-alih menggunakan konstruktor Bitmap, saya harus mengatur Uri setelah pengaturan
CacheOption
BitmapCacheOption.OnLoad
. (DiImage1
bawah ini adalahImage
elemen Wpf )Dari pada
Menggunakan:
Lihat ini: Cache Gambar WPF
sumber
BitmapCacheOption.OnLoad
untuk memutuskan sambungannya dari sumber pemuatan.Coba kode ini:
sumber
Saya menggunakan imageprocessor untuk mengubah ukuran gambar dan suatu hari saya mendapat pengecualian "Terjadi kesalahan umum di GDI +".
Setelah mendongak beberapa saat saya mencoba untuk mendaur ulang kumpulan aplikasi dan bingo itu berfungsi. Jadi saya catat di sini, semoga membantu;)
Bersulang
sumber