2012-05-17 21 views
6

PixelFormat.Format24bppRgb kodlamayla çok büyük bir resim (aprox 24000 x 22000) oluşturmam gerekiyor. BenC# çok büyük bir görüntü üretin C#

Ne yapmaya çalışıyorum bu ... zar zor imkansız açmak için biliyorum: Ben bir 11TR dosyasını işleyemez gibi bir istisnası atılır Beklendiği gibi

Bitmap final = new Bitmap(width, height, PixelFormat.Format24bppRgb); 

hafıza bu şekilde kolay.

Ancak bir fikrim vardı: Dosyayı oluştururken yazabilir miyim? Yani, RAM üzerinde çalışmak yerine, HD üzerinde çalışacağım.

Sadece daha iyi açıklamak gerekirse: 13K fayansa sahibim ve bu aptalca insanca dosyada bir araya getirmeyi planlıyorum. Onları bir emir düzeninde tekrarlayabildiğim için, güvenli olmayan kod kullanarak doğrudan belleğe yazabileceğim şey.

Herhangi bir öneriniz var mı?

+0

Yönetilmeyen kod yerine, lütfen güvenli olmayan kodu okuyun ... –

+4

Bkz. [Bellek eşlemeli dosyalar] (http://msdn.microsoft.com/en-us/library/dd997372.aspx). – GSerg

+1

@GSerg belleğe alınmış dosya _can_ büyük bir dosyadan bölümleri açmak/düzenlemek için kullanılabilir .... ama ** NOT RECOMMANDED ** bellek mappedfile'daki bu büyük dosyaları yaratıyor !!! –

cevap

2

BMP gibi sıkıştırılmamış bir biçimde yazabilirsiniz. BMP, ham renk baytlarını satırlara kaydeder. Böylece, ilk sıradaki karoları yüklersiniz, ayrı piksel satırlarını okur ve çıktı görüntüsünde kompozit tek sıra olarak yazarsınız. Bu sayede sadece birkaç fayans açabilir ve çıktı görüntüsünü derhal yazabilirsiniz.

Ama JPG veya PNG gibi sıkıştırılmış görüntü olarak nasıl yazılacağını bilmiyorum. Ama eminim ki bunun için özel bir yazılım var.

+0

Fikrinizi aldım ve bu iyi bir yaklaşım, ancak bir sorun var: Bitmap sınıfı, sistemin bu kadar büyük dosyaları işleyip işleyemeyeceğini kontrol ettiğinden, yeni Bitmap'den() geçmeme izin vermez. –

+1

Burada önemli olan nokta, görüntü işleme için yerleşik sınıfları kullanmamanızdır. Ham yapmalısın. Söylediğim gibi, herhangi bir karmaşık sıkıştırma algoritması olmadan yazabileceğiniz aşırı basit ham görüntü formatı olan BMP'yi kullanın. – Euphoric

+0

Hmmm ... Şimdi anladım. Bu gerçekten iyi bir fikir! Bir deneyeceğim! Teşekkürler! –

0

Tamamlandığında bu görüntü ile ne yapmak istediğinize bağlı olarak, onu 4'e böler ve bu şekilde çalışmanızı öneririm. OOM istisnası atılmadan 10.000 x 10.000 piksel ile çalıştım.

+0

Şu anda tam olarak benim yaptığım şey geçerli bir çözümdür, ancak bu dosyaları oluştururken hiç acele etmediğim için, problem için yaklaşımları inceliyorum! –

+0

FWIW, 8192 x 8192 pikselin altında kalmak çok daha güvenli. Özellikle birden fazla dokuyu bir kerede bellekte tutuyorsanız (örneğin, birinden diğerine kopyalamak için). – ToolmakerSteve

3

ImageMagick'in Large Image Support (tera-pixel), görüntüyü oluşturduğunuz karolara sahip olduğunuzda bir araya getirmenize yardımcı olabilir. Komut satırını kullanabilir ve sarıcısını kullanarak komutları kullanabilir veya bu ImageMagick.NET'u bir API olarak kullanabilirsiniz.

+0

Umut verici görünüyor! Bu API'ye bir göz atacağım! Teşekkürler! –

+0

ImageMagik'in güncellenmiş sürümü.NET http://magick.codeplex.com/ – Jonathan

+0

ImageMagick.NET bağlantısı için teşekkürler - Daha önce fark etmedim. – ToolmakerSteve