Terkadang saya perlu menulis lebih banyak dokumentasi dari sekadar komentar dalam kode. Dan terkadang, penjelasan itu membutuhkan tangkapan layar. Terkadang kondisi untuk mendapatkan tangkapan layar seperti itu sangat aneh sehingga saya meminta pengembang untuk mengambil tangkapan layar untuk saya. Terkadang tangkapan layar tidak sesuai dengan spesifikasi saya dan saya harus mengubah ukurannya agar terlihat bagus.
Seperti yang Anda lihat, keadaan untuk kebutuhan akan sihir "Lossless Screenshot Resizer" sangat tidak mungkin. Bagaimanapun, bagi saya sepertinya saya membutuhkannya setiap hari. Tapi itu belum ada.
Saya pernah melihat Anda di sini di PCG memecahkan teka-teki grafis yang mengagumkan sebelumnya, jadi saya kira ini agak membosankan untuk Anda ...
Spesifikasi
- Program ini mengambil tangkapan layar dari satu jendela sebagai input
- Tangkapan layar tidak menggunakan efek kaca atau sejenisnya (jadi Anda tidak perlu berurusan dengan hal-hal latar belakang yang menyinari)
- Format file input adalah PNG (atau format lossless lainnya sehingga Anda tidak harus berurusan dengan artefak kompresi)
- Format file output sama dengan format file input
- Program ini membuat tangkapan layar dengan ukuran berbeda sebagai output. Persyaratan minimum menyusut ukurannya.
- Pengguna harus menentukan ukuran output yang diharapkan. Jika Anda dapat memberikan petunjuk tentang ukuran minimum yang dapat dihasilkan oleh program Anda dari input yang diberikan, itu sangat membantu.
- Tangkapan layar keluaran tidak boleh kurang informasi jika ditafsirkan oleh manusia. Anda tidak akan menghapus konten teks atau gambar, tetapi Anda harus menghapus area dengan latar belakang saja. Lihat contoh di bawah ini.
- Jika tidak mungkin untuk mendapatkan ukuran yang diharapkan, program harus mengindikasikan hal itu dan tidak sekadar crash atau menghapus informasi tanpa pemberitahuan lebih lanjut.
- Jika program menunjukkan area yang akan dihapus karena alasan verifikasi, itu akan meningkatkan popularitasnya.
- Program mungkin memerlukan beberapa input pengguna lain, misalnya untuk mengidentifikasi titik awal untuk optimasi.
Aturan
Ini adalah kontes popularitas. Jawaban dengan suara terbanyak pada 2015-03-08 diterima.
Contohnya
Tangkapan layar Windows XP. Ukuran asli: 1003x685 piksel.
Contoh area (merah: vertikal, kuning: horizontal) yang dapat dihapus tanpa kehilangan informasi (teks atau gambar). Perhatikan bahwa bilah merah tidak bersebelahan. Contoh ini tidak menunjukkan semua kemungkinan piksel yang berpotensi dihapus.
Ubah ukuran lossless: 783x424 piksel.
Tangkapan layar Windows 10. Ukuran asli: 999x593 piksel.
Contoh area yang bisa dihapus.
Tangkapan layar yang hilang ukurannya: 689x320 piksel.
Perhatikan bahwa boleh saja teks judul ("Unduhan") dan "Folder ini kosong" tidak lagi berada di tengah. Tentu saja, akan lebih baik jika dipusatkan, dan jika solusi Anda menyatakannya, itu akan menjadi lebih populer.
sumber
Jawaban:
Python
fungsi ini
delrows
menghapus semua kecuali satu baris duplikat dan mengembalikan gambar yang ditransposisikan, menerapkannya dua kali juga menghapus kolom dan mentransposnya kembali. Selain ituthreshold
mengontrol berapa banyak piksel yang dapat berbeda untuk dua baris yang masih dianggap samaMembalik pembanding
mask
dari dari>
ke<=
sebaliknya akan menampilkan area yang dihapus yang sebagian besar ruang kosong.golf (karena mengapa tidak)
Alih-alih membandingkan setiap piksel, ia hanya melihat jumlah, sebagai efek samping ini juga mengubah tangkapan layar menjadi skala abu-abu dan memiliki masalah dengan permutasi penjumlahan jumlah, seperti panah bawah di bilah alamat Win8 tangkapan layar
sumber
Java: Coba lossless dan mundur ke sadar konten
(Hasil lossless terbaik sejauh ini!)
Ketika saya pertama kali melihat pertanyaan ini, saya pikir ini bukan teka-teki atau tantangan, hanya seseorang yang sangat membutuhkan program dan kode itu;) Tetapi sudah menjadi sifat saya untuk menyelesaikan masalah penglihatan sehingga saya tidak dapat menghentikan diri saya untuk mencoba tantangan ini. !
Saya datang dengan pendekatan dan kombinasi algoritma berikut.
Dalam pseudo-code tampilannya seperti ini:
Teknik yang digunakan:
Program
Program ini dapat memotong tangkapan layar lossless tetapi memiliki opsi untuk mundur ke pemotongan konten-sadar yang tidak 100% lossless. Argumen dari program ini dapat disesuaikan untuk mencapai hasil yang lebih baik.
Catatan: Program ini dapat ditingkatkan dengan banyak cara (saya tidak punya banyak waktu luang!)
Argumen
Kode
Hasil
Tangkapan layar XP lossless tanpa ukuran yang diinginkan (Max lossless compression)
Argumen: "image.png" 1 1 5 10 false 0
Hasil: 836 x 323
Tangkapan layar XP hingga 800x600
Argumen: "image.png" 800 600 6 10 true 60
Hasil: 800 x 600
Algoritma lossless menghilangkan sekitar 155 garis horizontal daripada algoritma kembali ke penghapusan konten-sadar sehingga beberapa artefak dapat dilihat.
Tangkapan layar Windows 10 hingga 700x300
Argumen: "image.png" 700 300 6 10 true 60
Hasil: 700 x 300
Algoritma lossless menghilangkan 270 garis horizontal daripada algoritma kembali ke penghapusan konten-sadar yang menghilangkan 29 lainnya. Vertikal hanya algoritma lossless yang digunakan.
Screenshot Windows 10 menyadari konten hingga 400x200 (uji)
Argumen: "image.png" 400 200 5 10 true 600
Hasil: 400 x 200
Ini adalah tes untuk melihat bagaimana gambar yang dihasilkan akan terlihat setelah penggunaan fitur sadar konten yang parah. Hasilnya sangat rusak tetapi tidak bisa dikenali.
sumber
C #, algoritma seperti saya akan melakukannya secara manual
Ini adalah program pemrosesan gambar pertama saya dan butuh beberapa saat untuk menerapkan dengan semua itu
LockBits
dll. Tapi saya ingin cepat (menggunakanParallel.For
) untuk mendapatkan umpan balik yang hampir instan.Pada dasarnya algoritma saya didasarkan pada pengamatan tentang cara menghapus piksel secara manual dari tangkapan layar:
Saat ini saya melakukannya secara horizontal saja. Hasil vertikal dapat menggunakan algoritma yang sama dan beroperasi pada gambar yang diputar 90 °, jadi secara teori itu mungkin.
Hasil
Ini adalah tangkapan layar aplikasi saya dengan wilayah yang terdeteksi:
Dan ini adalah hasil tangkapan layar Windows 10 dan ambang 48 piksel. Outputnya adalah lebar 681 piksel. Sayangnya itu tidak sempurna (lihat "Cari Unduhan" dan beberapa bilah kolom vertikal).
Dan satu lagi dengan ambang 64 piksel (lebar 567 piksel). Ini terlihat lebih baik.
Hasil keseluruhan menerapkan rotasi untuk memotong dari semua bagian bawah juga (567x304 piksel).
Untuk Windows XP, saya perlu mengubah kode sedikit karena pikselnya tidak persis sama. Saya menerapkan ambang kesamaan 8 (perbedaan dalam nilai RGB). Perhatikan beberapa artefak di kolom.
Kode
Nah, upaya pertama saya pada pemrosesan gambar. Tidak terlihat sangat bagus, bukan? Ini hanya mencantumkan algoritma inti, bukan UI dan bukan rotasi 90 °.
sumber
Haskell, menggunakan penghapusan naif dari garis sekuensial duplikat
Sayangnya, modul ini hanya menyediakan fungsi dengan tipe yang sangat umum
Eq a => [[a]] -> [[a]]
, karena saya tidak tahu cara mengedit file gambar di Haskell, namun, saya yakin itu mungkin untuk mengubah gambar PNG ke[[Color]]
nilai dan saya membayangkaninstance Eq Color
menjadi mudah didefinisikan.Fungsi yang dimaksud adalah
resizeL
.Kode:
Penjelasan:
Catatan:
a : b
berarti elemen yanga
diawali dengan daftar jenisa
, menghasilkan daftar. Ini adalah konstruksi daftar yang mendasar.[]
menunjukkan daftar kosong.Catatan:
a :: b
saranaa
adalah tipeb
. Misalnya, jikaa :: k
, kemudian(a : []) :: [k]
, di mana[x]
menunjukkan daftar yang berisi hal-hal tipex
.Ini berarti bahwa
(:)
itu sendiri, tanpa argumen:: a -> [a] -> [a]
,. The->
menunjukkan fungsi dari sesuatu untuk sesuatu.The
import Data.List
hanya mendapat beberapa pekerjaan beberapa orang lain lakukan untuk kita dan memungkinkan kita menggunakan fungsi mereka tanpa menulis ulang mereka.Pertama, tentukan suatu fungsi
nubSequential :: Eq a => [a] -> [a]
.Fungsi ini menghilangkan elemen berikutnya dari daftar yang identik.
Jadi,
nubSequential [1, 2, 2, 3] === [1, 2, 3]
. Kami sekarang akan menyingkat fungsi ini sebagainS
.Jika
nS
diterapkan ke daftar kosong, tidak ada yang bisa dilakukan, dan kami dengan mudah mengembalikan daftar kosong.Jika
nS
diterapkan ke daftar dengan konten, maka pemrosesan sebenarnya dapat dilakukan. Untuk ini, kita membutuhkan fungsi kedua, di sini dalamwhere
-klik, untuk menggunakan rekursi, karena kitanS
tidak melacak elemen untuk dibandingkan.Kami beri nama fungsi ini
g
. Ini bekerja dengan membandingkan argumen pertama dengan kepala daftar yang telah diberikan, dan membuang kepala jika mereka cocok dan menyebut dirinya sendiri dengan argumen pertama yang lama. Jika tidak, itu menambahkan kepala ke ekor, melewati dirinya sendiri dengan kepala sebagai argumen pertama yang baru.Untuk menggunakannya
g
, kami memberikannya kepala argumennS
dan ekor sebagai dua argumennya.nS
sekarang bertipeEq a => [a] -> [a]
, mengambil daftar dan mengembalikan daftar. Ini mensyaratkan bahwa kita dapat memeriksa kesetaraan antara elemen karena hal ini dilakukan dalam definisi fungsi.Kemudian, kami menyusun fungsi
nS
dantranspose
menggunakan(.)
operator.Menyusun fungsi berarti berikut:
(f . g) x = f (g (x))
.Dalam contoh kami,
transpose
memutar tabel 90 °,nS
menghapus semua elemen yang sama berurutan dari daftar, dalam hal ini daftar lain (itulah tabel),transpose
memutarnya kembali dannS
lagi menghilangkan elemen sama berurutan. Ini pada dasarnya menghapus duplikat baris berikutnya kolom.Ini dimungkinkan karena jika
a
dapat diperiksa kesetaraan (instance Eq a
), maka[a]
juga.Pendeknya:
instance Eq a => Eq [a]
sumber