Adakah cara yang murah untuk mendapatkan dimensi sebuah gambar (jpg, png, ...)? Lebih disukai, saya ingin mencapai ini hanya dengan menggunakan perpustakaan kelas standar (karena pembatasan hosting). Saya tahu bahwa seharusnya relatif mudah untuk membaca header gambar dan menguraikannya sendiri, tetapi tampaknya sesuatu seperti ini seharusnya sudah ada. Juga, saya telah memverifikasi bahwa potongan kode berikut membaca seluruh gambar (yang tidak saya inginkan):
using System;
using System.Drawing;
namespace Test
{
class Program
{
static void Main(string[] args)
{
Image img = new Bitmap("test.png");
System.Console.WriteLine(img.Width + " x " + img.Height);
}
}
}
c#
.net
image
image-manipulation
Jan Zich
sumber
sumber
Jawaban:
Taruhan terbaik Anda seperti biasa adalah menemukan perpustakaan yang teruji dengan baik. Namun, Anda mengatakan itu sulit, jadi berikut adalah beberapa kode cerdik yang sebagian besar belum teruji yang seharusnya berfungsi untuk sejumlah kasus:
Semoga kodenya cukup jelas. Untuk menambahkan format file baru, Anda menambahkannya ke
imageFormatDecoders
dengan kunci berupa array "bit ajaib" yang muncul di awal setiap file dari format yang diberikan dan nilainya menjadi fungsi yang mengekstrak ukuran dari aliran. Sebagian besar format cukup sederhana, satu-satunya hal yang buruk adalah jpeg.sumber
throw e;
tetapi cukupthrow;
. Komentar dokumen XML Anda pada yang keduaGetDimensions
juga ditampilkanpath
alih-alihbinaryReader
yang
validateImageData
ditetapkan untukfalse
mencegah GDI + dari melakukan analisis mahal dari data gambar, sehingga sangat mengurangi waktu buka. Pertanyaan ini menjelaskan lebih banyak tentang subjek ini.sumber
new Bitmap()
.Sudahkah Anda mencoba menggunakan kelas Pencitraan WPF?
System.Windows.Media.Imaging.BitmapDecoder
, dll.?Saya yakin beberapa upaya dilakukan untuk memastikan codec tersebut hanya membaca sebagian file untuk menentukan informasi header. Ini layak untuk dicek.
sumber
Saya mencari sesuatu yang serupa beberapa bulan sebelumnya. Saya ingin membaca jenis, versi, tinggi dan lebar gambar GIF tetapi tidak dapat menemukan sesuatu yang berguna secara online.
Untungnya dalam kasus GIF, semua informasi yang diperlukan ada di 10 byte pertama:
PNG sedikit lebih kompleks (lebar dan tinggi masing-masing 4 byte):
Seperti disebutkan di atas, wotsit adalah situs yang bagus untuk spesifikasi rinci tentang gambar dan format data meskipun spesifikasi PNG di pnglib jauh lebih rinci. Namun, menurut saya entri Wikipedia tentang format PNG dan GIF adalah tempat terbaik untuk memulai.
Inilah kode asli saya untuk memeriksa GIF, saya juga telah menyatukan sesuatu untuk PNG:
sumber
Berdasarkan jawaban sejauh ini dan beberapa pencarian tambahan, tampaknya di perpustakaan kelas .NET 2 tidak ada fungsi untuk itu. Jadi saya memutuskan untuk menulis sendiri. Ini adalah versi yang sangat kasar. Saat ini, saya hanya membutuhkannya untuk JPG. Jadi itu melengkapi jawaban yang diposting oleh Abbas.
Tidak ada pemeriksaan kesalahan atau verifikasi lainnya, tetapi saat ini saya membutuhkannya untuk tugas terbatas, dan pada akhirnya dapat dengan mudah ditambahkan. Saya mengujinya pada beberapa gambar, dan biasanya tidak membaca lebih dari 6K dari sebuah gambar. Saya kira itu tergantung pada jumlah data EXIF.
sumber
Saya melakukan ini untuk file PNG
sumber
Ya, Anda benar-benar dapat melakukan ini dan kodenya tergantung pada format file. Saya bekerja untuk vendor pencitraan ( Atalasoft ), dan produk kami menyediakan GetImageInfo () untuk setiap codec yang melakukan minimum untuk mengetahui dimensi dan beberapa data lain yang mudah diperoleh.
Jika Anda ingin menggulung sendiri, saya sarankan memulai dengan wotsit.org , yang memiliki spesifikasi terperinci untuk hampir semua format gambar dan Anda akan melihat bagaimana mengidentifikasi file dan juga di mana informasi di dalamnya dapat ditemukan.
Jika Anda merasa nyaman bekerja dengan C, maka jpeglib gratis dapat digunakan untuk mendapatkan informasi ini juga. Saya berani bertaruh bahwa Anda dapat melakukan ini dengan pustaka .NET, tetapi saya tidak tahu caranya.
sumber
new AtalaImage(filepath).Width
melakukan sesuatu yang serupa?Atalasoft.Imaging.Codec.RegisteredDecoders.GetImageInfo ( fullPath ) .Size
Jawaban ICR yang diperbarui untuk mendukung jPegs & WebP progresif juga :)
sumber
Ini akan tergantung pada format file. Biasanya mereka akan menyatakannya dalam byte awal file. Dan, biasanya, implementasi pembacaan gambar yang baik akan memperhitungkannya. Saya tidak bisa mengarahkan Anda ke satu untuk .NET sekalipun.
sumber