Вы можете использовать sorted
с key
, который диктует, что сортировка выполняется путем разделения на символ _
, а затем сортировки по форме int
части слева от _
: [117 ]
filenames = os.listdir()
sorted_filenames = sorted(filenames, key=lambda x: int(x.split('_')[0]))
Затем просто переберите sorted_filenames
.
Ваше решение могло быть улучшено путем выборки данных RGB больше чем один пиксель за один раз (см. http://java.sun.com/javase/6/docs/api/java/awt/image/BufferedImage.html ), и не создавая три Цветовых объекта на каждом повторении внутреннего цикла.
final int width = image.getWidth();
int[] imgData = new int[width];
int[] maskData = new int[width];
for (int y = 0; y < image.getHeight(); y++) {
// fetch a line of data from each image
image.getRGB(0, y, width, 1, imgData, 0, 1);
mask.getRGB(0, y, width, 1, maskData, 0, 1);
// apply the mask
for (int x = 0; x < width; x++) {
int color = imgData[x] & 0x00FFFFFF; // mask away any alpha present
int maskColor = (maskData[x] & 0x00FF0000) << 8; // shift red into alpha bits
color |= maskColor;
imgData[x] = color;
}
// replace the data
image.setRGB(0, y, width, 1, imgData, 0, 1);
}
Я играл недавно немного с этим материалом, чтобы отобразить изображение по другому и исчезнуть изображение к серому.
Также маскирование изображения с маской с прозрачностью (моя предыдущая версия этого сообщения!).
я взял свою небольшую тестовую программу и настроил ее немного для получения требуемого результата.
Вот соответствующие биты:
TestMask() throws IOException
{
m_images = new BufferedImage[3];
m_images[0] = ImageIO.read(new File("E:/Documents/images/map.png"));
m_images[1] = ImageIO.read(new File("E:/Documents/images/mapMask3.png"));
Image transpImg = TransformGrayToTransparency(m_images[1]);
m_images[2] = ApplyTransparency(m_images[0], transpImg);
}
private Image TransformGrayToTransparency(BufferedImage image)
{
ImageFilter filter = new RGBImageFilter()
{
public final int filterRGB(int x, int y, int rgb)
{
return (rgb << 8) & 0xFF000000;
}
};
ImageProducer ip = new FilteredImageSource(image.getSource(), filter);
return Toolkit.getDefaultToolkit().createImage(ip);
}
private BufferedImage ApplyTransparency(BufferedImage image, Image mask)
{
BufferedImage dest = new BufferedImage(
image.getWidth(), image.getHeight(),
BufferedImage.TYPE_INT_ARGB);
Graphics2D g2 = dest.createGraphics();
g2.drawImage(image, 0, 0, null);
AlphaComposite ac = AlphaComposite.getInstance(AlphaComposite.DST_IN, 1.0F);
g2.setComposite(ac);
g2.drawImage(mask, 0, 0, null);
g2.dispose();
return dest;
}
остаток просто отображают изображения в небольшой панели Swing.
Примечание, что рисунок маски является уровнями серого, черной становящейся полной прозрачностью, белое становление полным непрозрачный.
, Хотя Вы разрешили свою проблему, я, хотя я мог совместно использовать свое взятие на ней. Это использует немного больше метода выхода Java, с помощью стандартных классов для обрабатывания/фильтрования изображений.
На самом деле, мой метод использует немного больше памяти (делающий дополнительное изображение), и я не уверен, что это быстрее (измерение соответствующих уровней могло быть интересным), но это немного более абстрактно.
, По крайней мере, у Вас есть выбор!:-)
На самом деле я понял его. Это, вероятно, не быстро способ сделать его, но это работает:
for (int y = 0; y < image.getHeight(); y++) {
for (int x = 0; x < image.getWidth(); x++) {
Color c = new Color(image.getRGB(x, y));
Color maskC = new Color(mask.getRGB(x, y));
Color maskedColor = new Color(c.getRed(), c.getGreen(), c.getBlue(),
maskC.getRed());
resultImg.setRGB(x, y, maskedColor.getRGB());
}
}